在下面的例子中,
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)
{
}
};
请帮助我理解这种行为。
提前致谢。
答案 0 :(得分:3)
在您的示例中,您通过构造函数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;
// ...
};