c++ - C++ 初始化常量
问题描述
我需要能够在构造函数中初始化一个 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:在函数'int main(int,char**)'中: main.cpp:35:15:错误:使用已删除的函数 'kunde& kunde::operator=(const kunde&)' v[0] = v[1]; ^ 在 main.cpp:17:0 包含的文件中: kunde.h:19:7: 注意:'kunde& kunde::operator=(const kunde&)' 被隐式删除,因为默认定义格式不正确: 类昆德{ ^~~~~ kunde.h:19:7: 错误:非静态 const 成员 'const int kunde::knr',不能使用默认赋值运算符
解决方案
knr
应该是一个帐号。每次创建对象时,它都会创建一个新的 const 帐号并保留。
如评论中所述,因为knr
is const
,编译器无法为该类生成默认的复制分配operator=
,这正是编译器抱怨的v[0] = v[1];
语句:
注意: 'kunde& kunde::operator=(const kunde&)' 被隐式删除,因为默认定义格式错误
const
成员一旦初始化就不能重新分配,因此不能被复制。
a 中的元素vector
必须是CopyAssignable
and CopyConstructible
(至少在 C++11 之前),但是您的类没有可行的 copy-assignment operator=
,所以它不是CopyAssignable
(而且它也不MoveAssignable
在 C++11 中,因为可行的移动-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;
...
};
kunde::kunde(string name, int alter)
: knr(MaxKnr++), name(name), alter(alter)
{
}
kunde::kunde(const kunde& orig)
: knr(MaxKnr++), name(orig.name), alter(orig.alter)
{
}
kunde::kunde(kunde&& orig)
: knr(MaxKnr++), name(std::move(orig.name)), alter(orig.alter)
{
}
kunde& kunde::operator=(const kunde& rhs)
{
if (&rhs != this)
{
name = rhs.name;
alter = rhs.alter;
// CAN'T BE DONE, SO IGNORE IT
// knr = rhs.knr;
}
return *this;
}
kunde& kunde::operator=(kunde&& rhs)
{
name = std::move(rhs.name);
alter = rhs.alter;
// CAN'T BE DONE, SO IGNORE IT
// knr = rhs.knr;
return *this;
}
推荐阅读
- python - 我在 spyder 中有 python 脚本,我希望它每天下午 4 点运行
- c# - 请求被中止:使用 X509Certificate2 时无法创建 SSL/TLS 安全通道
- regex - 我如何匹配不包括这些的引号之间的内容?
- sql-server - SQL 首先检查列名而不是条件,并给我一个错误无效的列名。如何解决这个问题?
- c# - 模型更新后未设置属性
- networking - Kubernetes 集群中是否可以有隔离的网络?
- javascript - html中的图像隐藏在标题的导航栏下
- jquery - jquery如何获取image和div的交集数据
- paypal - 我可以在 PayPal Gateway 中使用 Braintree SDK(特别是我需要 Apple Pay)吗?
- html - 如何使我的导航栏菜单按钮工作?