Привет, я новичок в конструкторах в C++. У меня есть класс Auteur со следующим конструктором, конструктором копирования и деструктором:
class Auteur
{ public:
Auteur( string nom, bool prime=false) : nom_(nom), prime_(prime) {}
Auteur( const Auteur& a)=delete;
~Auteur() {}
private:
string nom_;
bool prime_;
};
Теперь я хочу создать новый класс, который использует класс Autheur вместе с двумя другими параметрами. Я так пробовал, но это не сработало. Кто-нибудь есть идея, как написать правильный конструктор для Oeuvre??
class Oeuvre
{ public:
Oeuvre(string titre, Auteur const& auteur_, string langue)
:titre_(titre), **auteur(nom, prime)**,langue_(langue)
Oeuvre(Oeuvre const& o) =delete;
:titre_(o.titre_), auteur_(o.auteur_),langue_(o.langue_) {}
~Oeuvre() {}
public:
Auteur auteur_;
Auteur auteur;
string langue_;
string titre_;
};
Спасибо за ответ. Я не хочу менять копию constr. Но у меня все еще есть проблема, когда я пытаюсь создать новый Oeuvre в основном:
int main()
{
Auteur a1("Victor Hugo"),
a3("Raymond Queneau", true);
Oeuvre o1("Les Misérables" , a1, "français" ),
o2("L'Homme qui rit" , a1, "français" );
return 0;
}
Поскольку для программы требуется 4 параметра для конструктора (Oeuvre), а в main() я создаю несколько объектов с тремя параметрами, я получаю сообщение об ошибке. (Я не хочу менять main())
Что я могу сделать по этому поводу?
Спасибо за ваши ответы.
Моим ответом было бы удалить (я имею в виду буквально удалить ваши объявления конструктора экземпляра) и просто разрешить работу по умолчанию. Оба класса имеют атрибуты, типы которых уже могут быть скопированы или назначены. Поэтому я смущен тем, почему вам когда-либо нужно было удалить конструктор копирования в первую очередь.
class Auteur
{ public:
Auteur( string nom, bool prime=false) : nom_(nom), prime_(prime) {}
// Get rid of the below statement
/*Auteur( const Auteur& a)=delete; */
~Auteur() {}
private:
// types are easily copyable so there is no reason to define your own or delete
// the defaults
string nom_; // string can easily deep copy itself
bool prime_; // bool is built in type
};
То же самое верно для другого класса. Просто разрешите их копировать с использованием значений по умолчанию.
Конструктор Oeuvre
хочет инициализировать объект Auteur
, скопировав переданный auteur
. Однако вы удалили созданный компилятором экземпляр-конструктор.
У вас есть 2 варианта:
Auteur
копиейAuteur
, перенаправляя аргументы.Второй вариант выглядит следующим образом:
Oeuvre(string titre, string nom, bool prime, string langue)
:titre_(titre), auteur_(nom, prime),langue_(langue)
{}