我需要能够在构造函数中初始化const成员,每次创建新对象时,该成员都会计数。在学校给我看了它应该如何工作,但是我一直都在犯错误。这与复制构造函数有关。
这是代码和编译器错误:
class kunde {
public:
kunde(string name, int alter);
kunde(const kunde& orig);
~kunde();
int GetAlter() const;
string GetName() const;
const int GetKnr() const;
private:
string name;
int alter;
const int knr;
static int cnt;
static int MaxKnr;
};
int kunde::cnt = 0;
int kunde::MaxKnr = 1000;
kunde::kunde(string name, int alter):knr(MaxKnr++) {
this->name = name;
this->alter = alter;
}
kunde::kunde(const kunde& orig):knr(MaxKnr++){
this->name = orig.name;
this->alter = orig.alter;
}
kunde::~kunde() {
}
int kunde::GetAlter() const {
return alter;
}
string kunde::GetName() const {
return name;
}
const int kunde::GetKnr() const {
return knr;
}
main.cpp: In function 'int main(int, char**)': main.cpp:35:15: error: use of deleted function 'kunde& kunde::operator=(const kunde&)' v[0] = v[1]; ^ In file included from main.cpp:17:0: kunde.h:19:7: note: 'kunde& kunde::operator=(const kunde&)' is implicitly deleted because the default definition would be ill-formed: class kunde { ^~~~~ kunde.h:19:7: error: non-static const member 'const int kunde::knr', can't use default assignment operator
答案 0 :(得分:0)
假设
knr
是一个帐号。每次创建对象时,它都会创建一个新的const帐号,该帐号一直存在。
如注释中所述,由于knr
为const
,因此编译器无法为该类生成默认的副本分配operator=
,这恰恰是编译器抱怨的。 v[0] = v[1];
语句:
注意:“ kunde&kunde :: operator =(const kunde&)”被隐式删除,因为默认定义格式不正确
const
成员一旦初始化就无法重新分配,因此无法复制。
vector
中的元素必须为CopyAssignable
和CopyConstructible
(至少在C ++ 11之前),但是您的课程没有可行的复制分配{{1} },因此它不是operator=
(在C ++ 11中也不是MoveAssignable
,因为也无法生成可行的移动分配CopyAssignable
)。>
解决方案是实现忽略operator=
的副本分配operator=
(以及可选的移动分配operator=
),例如:
knr
class kunde {
public:
kunde(string name, int alter);
kunde(const kunde& orig);
kunde(kunde&& orig);
...
kunde& operator=(const kunde& rhs);
kunde& operator=(kunde&& rhs);
...
private:
string name;
int alter;
const int knr;
...
};