c++;构造函数初始化列表 我是C++中的构造函数新手。我有一个具有以下构造函数、复制构造函数和析构函数的类autur: class Auteur { public: Auteur( string nom, bool prime=false) : nom_(nom), prime_(prime) {} Auteur( const Auteur& a)=delete; ~Auteur() {} private: string nom_; bool prime_; };

c++;构造函数初始化列表 我是C++中的构造函数新手。我有一个具有以下构造函数、复制构造函数和析构函数的类autur: class Auteur { public: Auteur( string nom, bool prime=false) : nom_(nom), prime_(prime) {} Auteur( const Auteur& a)=delete; ~Auteur() {} private: string nom_; bool prime_; };,c++,C++,现在我想创建一个新类,它使用类authur和其他2个参数。我试着这样做,但没有成功。有人知道如何为作品编写正确的构造函数吗 class Oeuvre { public: Oeuvre(string titre, Auteur const& auteur_, string langue) :titre_(titre), auteur(nom, prime),langue_(langue) Oe

现在我想创建一个新类,它使用类authur和其他2个参数。我试着这样做,但没有成功。有人知道如何为作品编写正确的构造函数吗

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_;
        };
谢谢你的回答。我不想更改副本。但我在尝试创作新的主要作品时仍然存在一个问题:

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个参数的对象,因此我得到了一个错误。(我不想更改main())

我能做些什么


谢谢你的回答。

好吧,你
删除了
d类的复制构造函数
Auteur
,这意味着

Auteur a1("Victor Hugo");
Auteur a2(a1);
现在是非法的,因为
a2
将从
a1
复制构建

类构造函数的初始值设定项列表与此相同。您正在使用多个参数构造
o1
,其中一个参数恰好是
a1
。现在,在
Oeuvre
的构造函数中,您正在初始化(即,从中构造)成员
auteur
,它正在使用复制构造函数,您可以
删除它

有两种解决方法:

1-不要
删除
Auteur
的复制构造函数。因为这个类似乎不管理任何资源,所以没关系

2-为
Oeuvre
的构造函数提供正确初始化
Auteur
所需的参数。我不同意这一点,因为这类人做这样的事情肯定与他们无关。

有几件事:

  • 对字符串参数使用常量(&C)。他们会被复制的 无论如何,进入成员,所以不需要额外的副本只是通过 让他们熟悉这些功能
  • 删除Auteur的复制构造函数可以;这很简单 确保对象不能按值传递,并且必须 每当它被使用时,都会受到尊敬
  • 删除所有作品的复制构造函数是没有意义的 也给它一个实现。要么有,要么没有,但是你 不能两者兼得
  • 如果你不需要一份单独的Auteur,但只想 引用现有对象,将其保持为常量引用成员 相反
  • 无需定义空析构函数。您将自动获得 默认值
  • 鉴于这些情况:

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


    **auteur(nom,prime)**
    到底是关于什么的?你得到的错误是什么?我看到的一个问题是,禁止复制
    Auteur
    类型的对象,但您正在将对
    Auteur
    对象的引用作为参数传递给
    Oeuvre
    的构造函数。尝试删除
    Auteur
    copy构造函数中的
    =delete
    ,看看是否仍有编译器错误。您能解释一下为什么要在Autere类中禁用赋值运算符吗?Autere类中没有任何内容表明赋值运算符是危险的、不需要的、昂贵的、占用资源的或其他任何东西。您的类仅由两个简单的成员变量组成。auteur(nom,prime)应该是auteur(nom,prime)@user3443063-看起来您正在寻找解决方案的问题。我建议在你有理由这样做之前不要禁用任何操作员。在Autere和Oeuvre类中,对于这些简单的类和类型,不需要禁用这些操作符。
    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;
    }