Закрытая переменная C ++ без ctor по умолчанию - не компилируется? - PullRequest
2 голосов
/ 20 ноября 2011

У меня есть класс obj1, который не имеет конструктора по умолчанию, и класс obj2, который также не имеет конструктора по умолчанию и имеет в качестве приватной переменной элемент obj1:

Я хотел бы что-то вроде следующего кода - но на самом деле это не компилируется, говоря мне, что у obj1 нет конструктора по умолчанию.

class obj1{
    obj1(some parameters){};
}

class obj2{
    obj1 _myObj1;
    obj2(some parameters){
        _myObj1 = obj1(some parameters)
    }
} 

есть идеи?

Ответы [ 4 ]

2 голосов
/ 20 ноября 2011

Вам нужно сделать ваши конструкторы общедоступными и вам нужно вызвать obj1 в списке инициализации конструктора obj2.

class obj1{
public:
    obj1(some parameters){};
}

class obj2{
    obj1 _myObj1;
public:
    obj2(some parameters) : _myObj1(some parameters)
    {
    }
} 
1 голос
/ 20 ноября 2011

Сделать конструктор obj1 общедоступным и использовать список инициализации в obj2.

class obj1{
public:
    obj1(some parameters){};
};

class obj2{
    obj1 _myObj1;
    obj2(some parameters) : _myObj1(some parameters) {
    }
};
1 голос
/ 20 ноября 2011

Вы должны поместить своего конструктора в public область:

class obj1{
    public:
    obj1(some parameters){};
}

и даже второй класс:

    class obj2{
        obj1 _myObj1;
        public:
        obj2(some parameters) : _myObj1(some parameters){
        }
    } 

Подробнее:

Фактически, частные конструкторы полезны, когда вы хотите запретить вашему коду напрямую создавать экземпляр объекта.Самым популярным использованием частных конструкторов являются классы Singleton.

0 голосов
/ 20 ноября 2011

Вам нужно сделать конструктор доступным для класса obj2. Это можно сделать, сделав его общедоступным, чтобы все другие классы могли его использовать, или вы можете пометить obj2 как друга obj1.

class obj2;

class obj1{
    obj1(some parameters){};
    friend class obj2;
}

class obj2{
    obj1 _myObj1;
    obj2(some parameters){
        _myObj1 = obj1(some parameters)
}

или пометить конструктор как открытый

obj1 {
public:
    obj1(some parameters){};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...