我怎样才能在构造函数中初始化C ++对象成员variables?

我有一个有一些对象作为成员variables的类。 我不想在声明时调用对象的构造函数,所以我试图挂在指向对象的指针上。 我不知道我在做什么。 O_O

在stackoverflow,我似乎能够find其他对象成员variables的例子,但通常立即调用构造函数,就像这样:

class MyClass { public: MyClass(int n); private: AnotherClass another(100); // this constructs AnotherClass right away! }; 

但是我想让MyClass构造函数调用AnotherClass构造函数。 这是我的代码看起来像:

BigMommaClass.h

 #include "ThingOne.h" #include "ThingTwo.h" class BigMommaClass { public: BigMommaClass(int numba1, int numba2); private: ThingOne* ThingOne; ThingTwo* ThingTwo; }; 

BigMommaClass.cpp

 #include "BigMommaClass.h" BigMommaClass::BigMommaClass(int numba1, int numba2) { this->ThingOne = ThingOne(100); this->ThingTwo = ThingTwo(numba1, numba2); } 

这是我在编译时遇到的错误:

 g++ -Wall -c -Iclasses -o objects/BigMommaClass.o classes/BigMommaClass.cpp In file included from classes/BigMommaClass.cpp:1:0: classes/BigMommaClass.h:12:8: error: declaration of âThingTwo* BigMommaClass::ThingTwoâ classes/ThingTwo.h:1:11: error: changes meaning of âThingTwoâ from âclass ThingTwoâ classes/BigMommaClass.cpp: In constructor âBigMommaClass::BigMommaClass(int, int)â: classes/BigMommaClass.cpp:4:30: error: cannot convert âThingOneâ to âThingOne*â in assignment classes/BigMommaClass.cpp:5:37: error: â((BigMommaClass*)this)->BigMommaClass::ThingTwoâ cannot be used as a function make: *** [BigMommaClass.o] Error 1 

我使用正确的方法,但错误的语法? 还是应该从另一个方向来呢?

您可以指定如何初始化成员初始值设定项列表中的成员:

 BigMommaClass { BigMommaClass(int, int); private: ThingOne thingOne; ThingTwo thingTwo; }; BigMommaClass::BigMommaClass(int numba1, int numba2) : thingOne(numba1 + numba2), thingTwo(numba1, numba2) {} 

你正试图通过使用operator=来创build一个ThingOne ,这是不行的(语法不正确)。 此外,您正在使用类名称作为variables名称,即ThingOne* ThingOne 。 首先,我们来修改variables名称:

 private: ThingOne* t1; ThingTwo* t2; 

既然这些是指针,他们必须指向一些东西。 如果这个对象还没有被构造,你需要在BigMommaClass构造函数中使用新的方法明确地完成BigMommaClass工作:

 BigMommaClass::BigMommaClass(int n1, int n2) { t1 = new ThingOne(100); t2 = new ThingTwo(n1, n2); } 

一般来说,初始化列表是build筑的首选,所以它看起来像:

 BigMommaClass::BigMommaClass(int n1, int n2) : t1(new ThingOne(100)), t2(new ThingTwo(n1, n2)) { } 

这个问题有点老了,但是在初始化成员variables之前,在构造函数中做“更多工作”的c ++ 11中有另一种方法:

 BigMommaClass::BigMommaClass(int numba1, int numba2) : thingOne([](int n1, int n2){return numba1+numba2;}(numba1,numba2), thingTwo(numba1, numba2) {} 

上面的lambda函数将被调用,并将结果传递给thingOnes构造函数。 你当然可以使lambda复杂,只要你喜欢。