如何在另一个类中创建类的参数化构造函数作为数据成员
How to create parameterized constructor of a class in another class as a data member?
在下面的例子中,
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;
}
参考以下链接后:-
在通过构造函数传递变量的对象中创建对象
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’
如果给定链接中提到的解决方案是正确的,那么我的代码中有什么错误?我的下一个问题是。。。如果尝试在不使用初始化列表的情况下初始化编译器,为什么只有参数化的constructor()才会抛出编译器。
这将引发编译器错误:-
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不支持它)。请参阅此问题。在你的情况下,你可以使用它,正如克里斯所指出的:
class Auto {
// ...
Car ch{5};
int someVal = 5;
// ...
};
相关文章:
- 强制使用默认构造函数对成员进行未初始化的声明
- 构造函数干扰成员变量指定的初始值设定项?
- 将参数传递给构造函数和成员函数时移动或复制
- 调用非默认构造函数作为成员初始化
- 使用默认构造函数引用成员变量初始化错误
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- C 构造函数采用成员初始化器
- 使用构造函数作为成员函数的 C++(用于序列化)
- 根据二手构造函数声明成员
- 在构造函数的成员初始值设定项列表中使用带有指示符的初始值设定项列表以初始化匿名联合类型时出现编译错误
- 构造函数,成员对象
- 从默认构造函数调用成员的析构函数
- 根据参数设置构造函数的成员数据类型
- 组合构造函数从成员变量中获取变量
- 构造函数必须显式初始化没有默认构造函数的成员
- 的构造函数必须显式初始化没有默认构造函数的成员
- 有条件地构造没有默认构造函数的成员对象
- 引用变量出现错误,必须在构造函数基/成员初始值设定项中初始化
- 默认构造函数-推迟成员变量的初始化
- 显式默认构造函数和成员变量的初始化