Как создать параметризованный конструктор класса в другом классе в качестве члена данных?


В приведенном ниже примере

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’

Если решение, упомянутое в приведенных ссылках, верное, то что не так в моем коде? Мой следующий вопрос: почему только параметризованный конструктор() вызывает компилятор, если попытаться его инициализировать без использования списка инициализации.
Это вызовет ошибку компилятора: -

class Auto
{
        private:
                Car ch(5);
        public:
        Auto(int a)
        {

        }
};

Но это не так :-

class Auto
{
        private:
                Car ch;
        public:
        Auto(int a)
        {

        }
};

Пожалуйста, помогите мне понять это поведение.
Заранее спасибо.


person user1057741    schedule 21.06.2013    source источник


Ответы (1)


В вашем примере вы указываете своим конструктором 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;
// ...
};
person teh internets is made of catz    schedule 21.06.2013
comment
Тем не менее, вы не можете сделать Car ch(5);, вам нужно Car ch{5};. - person chris; 21.06.2013
comment
Но мне разрешено делать следующее: - private: Car ch; так почему компилятор не выдает ошибку в этом случае (не используя -std=c++) ?? - person user1057741; 21.06.2013
comment
private: Car ch; означает, что ваши экземпляры Auto будут владеть объектом Car. Когда такой объект будет создан, он автоматически создаст членов класса с конструктором по умолчанию (в случае Car ch он вызовет Car()). Но если вы хотите создать Car ch с определенным конструктором, например Car(int nsides), вы должны либо использовать инициализацию члена в классе, как прокомментировал Крис, либо указать нужный конструктор (ch(5)) после подписи конструктора Auto. Короче говоря: Car ch; вызывает конструктор по умолчанию, другие параметры вызывают определенные конструкторы. - person teh internets is made of catz; 22.06.2013