繁体   English   中英

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

[英]c++ constructor initialisation list

嗨,我是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中创建一个新的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()中,我仅用3个参数创建了一些对象,但出现错误。 (我不想更改main())

我该怎么办?

感谢您的回答。

好吧, delete d类Auteur的copy构造函数,这意味着类似

Auteur a1("Victor Hugo");
Auteur a2(a1);

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

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

解决此问题的方法有两种:

1-不要delete Auteur的副本构造函数。 由于此类似乎没有管理任何资源,所以很好。

2-为Oeuvre的构造函数提供正确初始化Auteur所需的参数。 我不会去做这件事,因为它当然与该课程无关。

有两件事:

  1. 使用const&作为字符串参数。 无论如何,它们都将被复制到成员中,因此无需多余的复制即可将它们传递给函数。
  2. 删除Auteur的副本构造函数就可以了; 它只是确保对象每次使用时都不能通过值传递,而必须通过崇敬来传递。
  3. 删除Oeuvre的副本构造函数并为其提供实现是没有意义的。 要么只有一个,要么没有。
  4. 如果您不需要单独的Auteur副本,而只想引用现有对象,则将其保留为常量引用成员。
  5. 无需定义一个空的析构函数。 您将自动获得默认值。

鉴于这些事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM