c ++构造函数初始化列表

时间:2014-03-20 18:31:55

标签: c++

嗨,我是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)

好吧,你delete是类Auteur的复制构造函数,这意味着像

这样的构造
Auteur a1("Victor Hugo");
Auteur a2(a1);

现在是非法的,因为a2将从a1复制构建。

类的初始化列表'构造函数与此不同。您正在使用多个参数构建o1,其中一个参数恰好是a1。现在,在Oeuvre的构造函数中,您正在初始化(即构建)成员auteur,它正在使用复制构造函数 - 您delete d!

有两种解决方法:

1 - 不要delete Auteur的复制构造函数。由于这个课程似乎没有管理任何资源,这很好。

2 - 为Oeuvre的构造函数提供正确初始化Auteur所需的参数。我不会选择这个,因为这个班级肯定不关心这个事情。

答案 1 :(得分:0)

有几件事:

  1. 使用const&用于字符串参数。他们会被复制 无论如何进入成员所以不需要额外的副本来传递 他们参加了这些活动。
  2. 删除Auteur的复制构造函数很好;它很简单 确保对象不能通过值传递,必须是 无论什么时候使用它都会被尊重。
  3. 删除Oeuvre和的复制构造函数是没有意义的 也给它一个实现。要么有一个,要么没有你 不能同时拥有两者。
  4. 如果您不需要单独的Auteur副本,但只需要 引用现有对象,将其保留为常量引用成员 代替。
  5. 无需定义空的析构函数。你会自动得到的 默认。
  6. 考虑到这些:

    #include <string>
    
    class Auteur
    {   
    public:   
      Auteur(std::string const& nom,  bool prime=false)          
      : nom_(nom), prime_(prime)  
      {}
    
      Auteur(Auteur const&) = delete;         
    
    private:
      std::string nom_;
      bool prime_;
    };
    

    class Oeuvre
    {   
    public:   
      Oeuvre(std::string const& titre, std::string const& langue, Auteur& auteur)
      : titre_(titre), langue_(langue), auteur_(auteur)
      { }
    
      Oeuvre(Oeuvre const&) delete;
    
    public:
      const Auteur &auteur_;
      std::string langue_;
      std::string titre_;
    };
    

    int main()
    {
      Auteur a1("Victor Hugo"),
             a3("Raymond Queneau", true);
    
      Oeuvre o1("Les Misérables"  , "français", a1),
             o2("L'Homme qui rit" , "français", a1);
    
      return 0;
    }