为什么在设置类组合时,可以使用默认构造函数调用包含的类,但不能使用带参数的类调用?
这有点令人困惑;让我举个例子。
#include "A.h"
class B
{
private:
A legal; // this kind of composition is allowed
A illegal(2,2); // this kind is not.
};
假设存在默认构造函数和存在2个整数的构造函数,则只允许其中一个。这是为什么?
答案 0 :(得分:8)
可以肯定,但你只需要以不同的方式编写它。您需要为复合类的构造函数使用初始化列表:
#include "A.h"
class B
{
private:
A legal; // this kind of composition is allowed
A illegal; // this kind is, too
public:
B();
};
B::B() :
legal(), // optional, because this is the default
illegal(2, 2) // now legal
{
}
答案 1 :(得分:2)
您可以提供构造函数参数,但是您的成员初始化错误。
#include "A.h"
class B
{
private:
int x = 3; // you can't do this, either
A a(2,2);
};
以下是您的解决方案ctor-initializer
:
#include "A.h"
class B
{
public:
B() : x(3), a(2,2) {};
private:
int x;
A a;
};
答案 2 :(得分:0)
类声明不会初始化组成该类的成员。因此,当您尝试在声明中构建对象时出现错误。
成员初始化发生在类的构造函数中。所以你应该写:
#include "A.h"
class B
{
public:
B();
private:
A a;
};
B::B() :
a(2,2)
{
}