C ++如何使用初始化列表在另一个类中使用类

时间:2014-03-20 17:20:36

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

嗨,我是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和其他2个参数的新类。我试过这样但是没有用。有没有人知道如何为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_;
        };

感谢您的回答。我不想改变副本构造。 但是当我尝试在main中创建一个新的全部作品时,我仍然遇到问题:

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()我创建一些只有3个参数的对象我得到一个错误。 (我不想改变主())

我该怎么办?

感谢您的回答。

2 个答案:

答案 0 :(得分:0)

您的Oeuvre构造函数想要通过复制传递的Auteur来初始化auteur对象。但是,您已删除了编译器生成的copy-constructor。

您有两种选择:

  • 启用复制构造函数并按副本
  • 初始化Auteur
  • 通过转发参数来使用用户定义的Auteur构造函数。

第二个选项如下:

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

答案 1 :(得分: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
    };

其他班级也是如此。只需使用默认值即可复制它们。