- ベストアンサー
C++Builderのクラス
普段、新規アプリケーションの作成で、TForm1クラスでプログラミングしています。ここに、例えば、Xクラスなどを追加作成したいのですが、.hファイルに記述するのか、.cppファイルに記述すべきなのか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 unit2.h, unit2.cppについてはNo.2の回答のようにしてもらうとして、 >Form1から、変数Aを参照出来ません。 変数が宣言されていないからです。 (クラスと全然関係ない関数main内で宣言されたものに TForm1::Button1Clickからアクセスできないし、 mainのローカル変数はmain終了時に破棄される) Xの存在期間がTForm1::Button1Click内だけでいいなら TForm1::Button1Click内のローカル変数として宣言すればいいし、 TForm1::Button1Click終了時も値を保持したい、 TForm1クラスの他のメンバ関数でも使用したいのであれば TForm1クラスのメンバ変数(もしくはグローバル変数)にすればいいです。 あと、 >(ファイル->ユニットヘッダーファイルの追加でもいい) やっぱり自分で書いたほうがいいです。 自分ならこうします //unit1.h #ifndef Unit1H #define Unit1H //---------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include "Unit2.h" // <----------------------追加 //---------------------------------------------------- class TForm1 : public TForm { __published: // IDE 管理のコンポーネント TButton *Button1; TEdit *Edit1; void __fastcall Button1Click(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); //オブジェクトインスペクタで追加 private: // ユーザー宣言 X *c; // <----------------------追加 public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //unit1.cpp #include <vcl.h> #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { c = new X; c->A = 19; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Edit1->Text = IntToStr(c->A); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { delete c; } //---------------------------------------------------------------------------
その他の回答 (2)
- KoHal
- ベストアンサー率60% (110/181)
No.1の回答に対する補足のソースについて unit2.cppにmain()があるのを削除。 というか、unit2.hでclass Xのメンバ関数定義まで記述しているので、この場合unit2.cppそのものが不要です。 unit2.hでインクルードガードがおかしい。#endifはファイルの末尾に移動。 取り敢えずこれで動作するはずです。 以下は補足ですが。 ヘッダファイルで関数定義までするなら普通こうします。 //unit2.h #ifndef Unit2H #define Unit2H class X { public: int A; X() { //処理 }; ~X() { //処理 }; }; #endif 通常はヘッダでクラス定義、cppファイルで関数定義です。 //unit2.h #ifndef Unit2H #define Unit2H class X { public: int A; X(); ~X(); }; #endif //unit2.cpp #include "unit2.h" X:X() { // } X:~X() { // } あと、ヘッダファイルのインクルードは必要なものに限るようにしましょう。そのソースだとunit2.cppにunit1.hは必要ありません。
- kmb01
- ベストアンサー率45% (63/138)
新規ユニットを追加して.hファイルで宣言、.cppファイルで定義するのがいい。 そしてフォームの.cppファイルで新規ユニットの.hファイルをインクルードする。 (ファイル->ユニットヘッダーファイルの追加でもいい) フォームの.cppファイル内で宣言、定義することも出来るが、 宣言した行より下でないとそのクラスが使えないし、探しづらくなる。 新規クラスは新規クラスで一まとめにしておいたほうがいい。
お礼
漠然とした質問で申し訳ありません。 複数のFormクラスを使ったプログラミングから脱却出来そうです。 回答No.3で頂いた具体的なコードにて、トライしてみたいと思います。
補足
プログラミングの方針についてのアドバイスを有難う御座います。何となく記述できそうな感じですが、Form1から、変数Aを参照出来ません。C++Builderで、TForm以外のクラスの変数を扱う場合には、unit2に、どのようなコードを記述すれば良いのでしょう? unit1.cppが、 #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //---------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //---------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Edit1->Text = IntToStr(X().A); } //---------------------------------------------------- unit1.hが #ifndef Unit1H #define Unit1H //---------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //---------------------------------------------------- class TForm1 : public TForm { __published: // IDE 管理のコンポーネント TButton *Button1; TEdit *Edit1; void __fastcall Button1Click(TObject *Sender); private: // ユーザー宣言 public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); }; //---------------------------------------------------- extern PACKAGE TForm1 *Form1; //---------------------------------------------------- #endif unit2.cppを #pragma hdrstop #include "Unit2.h" #include "Unit1.h" //-------------------------- #pragma package(smart_init) //-------------------------- int main() { X c; c A =19; } unit2.hが #ifndef Unit2H #define Unit2H //---------------------------- #endif class X{ public: X();//コンストラクタ ~X();//デストラクタ int A; private: }; //---------------------------- //コンストラクタの定義 X::X() { // int *A = new int; } //---------------------------- //デストラクタの定義 X::~X() { // delete A; } //-----------------------------
お礼
Xの存在期間に関する説明と、具体例を有難う御座います。unit2内でXをdeleteしない限り、Xは存在し続けるのかと考えておりました。 No1の御返事も、No3の御返事も、当方の悩んでいることに対して直接的な御説明でした。 解決できそうです。