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

时间:2013-06-21 18:40:14

标签: c++ c++11 constructor default-constructor


   在下面的例子中,

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)
        {

        }
};

请帮助我理解这种行为。
提前致谢。

1 个答案:

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