クラス内の任意のメソッドから参照できるように、デフォルトのコンストラクターを持たないオブジェクトをインスタンス化しようとしています。ヘッダーファイルで宣言しましたが、コンパイラーは、それを作成するクラスのコンストラクターがメンバーを明示的に初期化する必要があると言っており、その方法はわかりません。
あなたの答えを本当に感謝します、前もってありがとう!
スニペット:
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;
}
あなたはほとんどそこにいます。 c ++でオブジェクトを作成すると、デフォルトでは、すべてのオブジェクトでデフォルトコンストラクターが実行されます。これにより、使用するコンストラクターを言語に伝えることができます。
MyClass::MyClass() : myObject(60){
myObject.doSomething();
}
そうすれば、デフォルトのコンストラクターを見つけようとせず、必要なコンストラクターを呼び出します。
コンストラクターの初期化リストでmyObject
メンバーを初期化する必要があります。
MyClass::MyClass() : myObject(60) {
myObject.doSomething();
}
コンストラクターの本体を入力する前に、すべてのメンバー変数を初期化する必要があります。コンストラクターの初期化リストでメンバーを指定しない場合、メンバーはデフォルトで構築されます。 MyOtherClass
にはコンパイラが放棄するデフォルトのコンストラクタがないためです。
次の行に注意してください。
MyOtherClass myObject (60);
コンストラクターでは、実際にmyObject
メンバー変数をシャドウするローカル変数を作成しています。それはおそらくあなたが意図したものではありません。一部のコンパイラでは、そのための警告を有効にできます。
2つのエラーがあります
コードMyOtherClass myObject(60);
はクラスのメンバーを初期化するのではなく、代わりに、コンストラクター内でメンバーを隠すmyObject
という名前のローカル変数を宣言しています。既定のコンストラクターを持たないメンバーオブジェクトを初期化するには、代わりにメンバー初期化リストを使用する必要があります。
コンパイラを試してC++を学習しようとしています。これはひどく痛みを伴うパスになるため、最も重大なエラーです。 C++を学習する唯一の方法は、 1冊または2冊の良い本 を入手し、それらをカバーツーカバーで読むことです。どれだけ賢くてもC++で正しく推測できる方法はありません。ある意味では、正しい答えが非論理的であり、言語の歴史的進化の結果であるということはかなりの場所で起こるので危険です。どんなに賢くても歴史を推測する方法はありません...歴史を研究しなければなりません。
MyClass::MyClass(): myObject (60){
myObject.doSomething();
}
データメンバーの初期化は、コンストラクタ関数body ..の前に終了します