1

私は現在、取り組んでいるプロジェクトのOOPを学んでいます(私は高校生で、c ++の経験があります。これは、私の3番目の「大規模」(> 3か月)c ++プロジェクトです)。C++クラスの基本を理解しています。プロジェクトのクラスのいくつかを作ることができました。

これが私のpage.hヘッダーです。

class cl_Page{
public:
  cl_Page(cl_LessonMoment *parent_param);
  cl_Page(cl_SoftRoot *parent_param);
  int parent_type;
  cl_LessonMoment *parent_lmoment;
  cl_SoftRoot *parent_softroot;

  char id[256];

  //<content>
  //Backgrounds.
  str_Color bgcolor;
  cl_Image bgimage;

  //Actual content
  vector<cl_Textbox> textboxes;
  vector<cl_Button> buttons;
  vector<cl_Image> images;
  //</content>
};

(警備員などはここにはありませんが、私のプロジェクトにはあります)

そしてこれは私のpage.cppです:

cl_Page::cl_Page(cl_LessonMoment *parent_param){
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '\0';
  //bgimage(NULL);
  SetColor(bgcolor, 0x000000ff);
}

(他のコンストラクターも同様で、異なるタイプの親を設定するだけです)

私の問題は、cl_Pageコンストラクター内でbgimage(cl_Imageクラスタイプ)のコンストラクターを呼び出したいということです。これを試してみると(コンストラクターの行のコメントを外す)、明らかに機能しません。

そうですね、コンストラクターを今すぐ呼び出すにはどうすればよいですか?私は本当にcl_Pageオブジェクトと一緒にすべてのメンバーを構築する必要があります。

4

4 に答える 4

3

bgImageコンストラクターでオブジェクトを作成する場合cl_Pageは、ポインター(1)であるか、コンストラクターの初期化リスト(2)を使用する必要があります。この場合、これがおそらくより適切なソリューションになります。

1.-フィールドはcl_Imageへのポインタです

bgImage = new cl_Image(nullptr);

2.-コンストラクターの初期化リストの使用

cl_Page::cl_Page(cl_LessonMoment *parent_param) :
      bgImage(nullptr) 
{
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '\0';
  SetColor(bgcolor, 0x000000ff);
}

ここで、コンストラクターの初期化リストについて詳しく読むことができます:http ://www.cprogramming.com/tutorial/initialization-lists-c++.html

于 2013-01-29T17:19:10.213 に答える
2

メンバー初期化リストを使用して変数を初期化できます。

cl_Page::cl_Page(cl_LessonMoment *parent_param)
: bgImage(NULL)
{
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '\0';
  SetColor(bgcolor, 0x000000ff);
}

実際、これはコンストラクターでデータを設定するための推奨される方法です。

于 2013-01-29T17:16:18.710 に答える
1

次のようにメンバーを初期化する必要があります。

cl_Page::cl_Page(cl_LessonMoment *parent_param)
: parent_lmoment(parent_param)
, parent_type(1)
, bgimage(NULL)
{
    id[0] = '\0';
    SetColor(bgcolor, 0x000000ff);
}

コンストラクターのヘッドでポインターを初期化する必要はありませんが、それでもお勧めします。また、他のポインタを0で初期化することをお勧めします。バグが発生した場合に役立つ可能性があります;-)

于 2013-01-29T17:17:15.190 に答える
1
cl_Page::cl_Page(cl_LessonMoment *parent_param)
    : bgImage( nullptr )
{
  parent_lmoment = parent_param;
  parent_type = 1;
  id[0] = '\0';
  SetColor(bgcolor, 0x000000ff);
}
于 2013-01-29T17:15:48.160 に答える