在下面的例子中,
class Car
{
private:
int sides;
public:
Car()
{
cout<<"\ndefault called constructor";
}
Car(int nsides)
{
cout<<"\ncalled constructor";
sides=nsides;
}
};
class Auto
{
private:
Car ch;
public:
Auto(int a) : Car(a)
{
//Car test(5);
}
};
int main()
{
Auto at(5);
return 0;
}
引用以下链接后:-
create objects in object passing variables through constructor
http://www.cplusplus.com/forum/beginner/9746/
我尝试编写相同的代码并执行它。不幸的是,我遇到了以下编译器错误:-
check.cpp: In constructor ‘Auto::Auto(int)’:
check.cpp:44: error: type ‘Car’ is not a direct base of ‘Auto’
如果给定链接中提到的解决方案是正确的,那么我的代码有什么问题?我的下一个问题是......如果尝试在不使用初始化列表的情况下对其进行初始化,为什么只有参数化的构造函数()会抛出编译器。
这将引发编译器错误:-
class Auto
{
private:
Car ch(5);
public:
Auto(int a)
{
}
};
但这不是:-
class Auto
{
private:
Car ch;
public:
Auto(int a)
{
}
};
请帮助我理解这种行为。
提前致谢。
最佳答案
在您的示例中,您通过构造函数 Auto(int a) : Car(a)
指定 Auto 派生自 Car,这就是编译器所提示的。
要初始化您的 Car 对象(在 Auto 内部),请执行此操作 Auto(int a) : ch(a)
。您输入的是类型而不是成员的姓名。
关于你的第二个问题,类内成员初始化是C++11带来的新特性。您可以通过将参数 -std=c++11
添加到您的编译器(GCC 或 Clang,msvc 不支持它)来使用它。参见 this question .在你的情况下,你可以像克里斯指出的那样使用它:
class Auto {
// ...
Car ch{5};
int someVal = 5;
// ...
};
关于c++ - 如何在另一个类中创建一个类的参数化构造函数作为数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17242202/