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