C ++ Как использовать класс в другом классе со списком инициализации

0

Привет, я новичок в конструкторах в 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())

Что я могу сделать по этому поводу?

Спасибо за ваши ответы.

Теги:
c++11
initializer-list
default-constructor

2 ответа

0

Моим ответом было бы удалить (я имею в виду буквально удалить ваши объявления конструктора экземпляра) и просто разрешить работу по умолчанию. Оба класса имеют атрибуты, типы которых уже могут быть скопированы или назначены. Поэтому я смущен тем, почему вам когда-либо нужно было удалить конструктор копирования в первую очередь.

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

То же самое верно для другого класса. Просто разрешите их копировать с использованием значений по умолчанию.

0

Конструктор Oeuvre хочет инициализировать объект Auteur, скопировав переданный auteur. Однако вы удалили созданный компилятором экземпляр-конструктор.

У вас есть 2 варианта:

  • Включить конструктор копирования и инициализировать Auteur копией
  • Используйте определяемый пользователем конструктор Auteur, перенаправляя аргументы.

Второй вариант выглядит следующим образом:

Oeuvre(string titre,  string nom, bool prime, string langue)
        :titre_(titre), auteur_(nom, prime),langue_(langue)  
{}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню