5

私はこれを持っています:

class SistemPornire
{
Motor& m;
Electromotor& e;
public:
SistemPornire(Motor&,Electromotor&);
}

Motor と Electromotor は他の 2 つのクラスです。このクラスのコンストラクターを次のように定義しようとします。

SistemPornire::SistemPornire(Motor& M,Electromotor& E)
{
this->m = M;
this->e = E;
}

しかし、それは私に 'SistemPornire::m' を与えます: コンストラクターベース/メンバー初期化子リストで初期化する必要があり、 'SistemPornire::e' : コンストラクターベース/メンバー初期化子リストで初期化する必要があります

4

4 に答える 4

8

参照は作成時に常に初期化する必要があるため、初期化リストを使用する必要があります。

SistemPornire::SistemPornire(Motor& M,Electromotor& E) : m(M), e(E) { }
//                                                     ^^^^^^^^^^^^

これが必要でない場合、コンストラクターの本体は、オブジェクトにバインドされる前にそれらの参照にアクセスできます。ただし、C++ では、参照は常にオブジェクトにバインドする必要があります。

初期化リスト内の初期化は、コンストラクターの本体が実行される前 (およびすべての基本クラス サブオブジェクトの構築後) に実行されることが常に保証されます。

于 2013-03-17T13:11:10.340 に答える
0

これを試して:

SistemPornire::SistemPornire(Motor& M,Electromotor& E)
: m(M)
, e(E)
{

}
于 2013-03-17T13:11:48.387 に答える
0

初期化子リストは、コンストラクターの本体の前に実行される初期化のセットです。この場合、次のように使用できます。

SistemPornire::SistemPornire(Motor& M,Electromotor& E)
:
    m(M),
    e(E)
{}

これは、、およびで初期m化されます。MeE

初期化子リストは、すべてのメンバーの初期化に推奨され、参照など、初期化する必要のあるメンバーに必要です。たとえば、デフォルトのジャンク値を持つポインタとは対照的です。これは合法ですが、実際にポインタを使用すると未定義の動作が呼び出されます。

参照を常に初期化する必要がある理由は、参照が常に有効なオブジェクトを参照することが保証されているためです(たとえば、ポインターは、デフォルトのジャンク値を含め、必要なガベージを自由に指すことができます)。この必須の初期化のもう1つの結果は、次のコードです。

int someInt;
int& someReference; //Compile-time error: someReference must be intialized
someReference = someInt; //Too little, too late

もちろん、正しいコードは次のようになります。

int someInt;
int& someReference = someInt; //OK, someReference has been initialized
于 2013-03-17T13:13:25.797 に答える
0

参照は、メンバー初期化子リストで初期化する必要があります。

SistemPornire::SistemPornire(Motor& M, Electromotor& E) : m(M), e(E) {}
于 2013-03-17T13:11:22.147 に答える