web-dev-qa-db-ja.com

デフォルトのコンストラクターを持たないメンバーを明示的に初期化する

クラス内の任意のメソッドから参照できるように、デフォルトのコンストラクターを持たないオブジェクトをインスタンス化しようとしています。ヘッダーファイルで宣言しましたが、コンパイラーは、それを作成するクラスのコンストラクターがメンバーを明示的に初期化する必要があると言っており、その方法はわかりません。

あなたの答えを本当に感謝します、前もってありがとう!

スニペット:

MyClass.h

include "MyOtherClass.h"

class myClass {

    private:
        MyOtherClass myObject;

    public:
        MyClass();
        ~MyClass();
        void myMethod();

}

MyClass.cpp

include "MyClass.h"

MyClass::MyClass() {

   MyOtherClass myObject (60);
   myObject.doSomething();

}

MyClass::myMethod() {

    myObject.doSomething();

}

MyOtherClass.h

class MyOtherClass {

   private:
      int aNumber;

   public:
      MyOtherClass (int someNumber);
      ~MyOtherClass();
      void doSomething();
}

MyOtherClass.cpp

include "MyOtherClass.h"

MyOtherClass::MyOtherClass (int someNumber) {
   aNumber = someNumber;
}

void MyOtherClass::doSomething () {
    std::cout << aNumber;
}
22
Tomaz Fernandes

あなたはほとんどそこにいます。 c ++でオブジェクトを作成すると、デフォルトでは、すべてのオブジェクトでデフォルトコンストラクターが実行されます。これにより、使用するコンストラクターを言語に伝えることができます。

MyClass::MyClass() : myObject(60){

   myObject.doSomething();

}

そうすれば、デフォルトのコンストラクターを見つけようとせず、必要なコンストラクターを呼び出します。

23
Russell Greene

コンストラクターの初期化リストでmyObjectメンバーを初期化する必要があります。

MyClass::MyClass() : myObject(60) {
   myObject.doSomething();
}

コンストラクターの本体を入力する前に、すべてのメンバー変数を初期化する必要があります。コンストラクターの初期化リストでメンバーを指定しない場合、メンバーはデフォルトで構築されます。 MyOtherClassにはコンパイラが放棄するデフォルトのコンストラクタがないためです。

次の行に注意してください。

MyOtherClass myObject (60);

コンストラクターでは、実際にmyObjectメンバー変数をシャドウするローカル変数を作成しています。それはおそらくあなたが意図したものではありません。一部のコンパイラでは、そのための警告を有効にできます。

10
Chris Drew

2つのエラーがあります

  1. コードMyOtherClass myObject(60);はクラスのメンバーを初期化するのではなく、代わりに、コンストラクター内でメンバーを隠すmyObjectという名前のローカル変数を宣言しています。既定のコンストラクターを持たないメンバーオブジェクトを初期化するには、代わりにメンバー初期化リストを使用する必要があります。

  2. コンパイラを試してC++を学習しようとしています。これはひどく痛みを伴うパスになるため、最も重大なエラーです。 C++を学習する唯一の方法は、 1冊または2冊の良い本 を入手し、それらをカバーツーカバーで読むことです。どれだけ賢くてもC++で正しく推測できる方法はありません。ある意味では、正しい答えが非論理的であり、言語の歴史的進化の結果であるということはかなりの場所で起こるので危険です。どんなに賢くても歴史を推測する方法はありません...歴史を研究しなければなりません。

3
6502
MyClass::MyClass(): myObject (60){

   myObject.doSomething();

}

データメンバーの初期化は、コンストラクタ関数body ..の前に終了します

0
kiviak