非常に簡単なような問題が発生しているため、何かを見落とさなくてはなりません。イニシャライザリストの外でフィールドを初期化できません
クラス(非POD)であるフィールドを持つクラスを作成する必要があります。フィールドのクラスには、デフォルトのコンストラクタと "実際の"コンストラクタがあります。実際には、コンストラクタには、いくらか複雑なループを満たす必要のあるパラメータがあるため、イニシャライザリストにフィールドを実際に構築することはできません。
これは、問題を再現する最小限の例です。
ConstructorsTest.h:
class SomeProperty {
public:
SomeProperty(int param1); //Ordinary constructor.
SomeProperty(); //Default constructor.
int param1;
};
class ConstructorsTest {
ConstructorsTest();
SomeProperty the_property;
};
ConstructorsTest.cpp:
#include "ConstructorsTest.h"
ConstructorsTest::ConstructorsTest() {
the_property(4);
}
SomeProperty::SomeProperty(int param1) : param1(param1) {}
SomeProperty::SomeProperty() : param1(0) {} //Default constructor, doesn't matter.
しかし、これはコンパイルエラーを与える:
ConstructorsTest.cpp: In constructor 'ConstructorsTest::ConstructorsTest()':
ConstructorsTest.cpp:4:19: error: no match for call to '(SomeProperty) (int)'
the_property(4);
^
それは通常何のだろうそれのような何の示唆を与えていません代わりに機能を意図している可能性があります。
上記の例では、初期化リストでthe_property
を初期化するだけですが、実際には4
は実際には最初に生成する必要がある複雑なベクターなので実際にはできません。 the_property(4)
を初期化子リストに移動すると、コンパイルが成功します。
オブジェクトにはdefault constructor、またはit can't be constが必要です。両方の要件がここで満たされているようです。
ああ、実際にはそれらを '='で割り当てることです。私はそれが何か簡単であることを知っていた! – Ghostkeeper
@Ghostkeeper代入手法は、デフォルトでデータ・メンバーを作成し、それをコンストラクターの本体に割り当てると、メンバー・イニシャライザー・リストを使用するより効率が悪く、データ・メンバーを直接(割り当てなしで)構成します。 – songyuanyao