如何在另一个类中创建类的参数化构造函数作为数据成员

How to create parameterized constructor of a class in another class as a data member?

本文关键字:构造函数 数据成员 参数 创建 另一个      更新时间:2023-10-16


在下面的例子中,

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;
// ...
};