在C ++ 11中重置struct值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C ++ 11中重置struct值相关的知识,希望对你有一定的参考价值。
看起来这个问题已被问过几次,但我似乎无法根据现有的答案和指导让它工作。
这是代码:
#include <atomic>
class X
{
public:
X();
~X();
void alpha();
private:
struct A {
bool m;
std::atomic<bool> n;
bool fish();
};
A aval_;
};
X::X() : aval_() {}
X::~X() {}
bool X::A::fish() {
return true;
}
void X::alpha() {
aval_.m = false;
aval_ = {};
}
无法分配“X :: A”类型的对象,因为隐式删除了其复制赋值运算符
我应该压倒一些东西吗?我一般不是C ++程序员,所以请随时向我指出我可以了解更多信息的资源。
编辑:更新了源代码以包含std::atomic<bool>
。
答案
原因是因为std::atomic
没有默认的拷贝构造函数。请尝试以下代码:
std::atomic<bool> v1(false);
std::atomic<bool> v2 = v1;
你应该得到的错误是:
error: call to implicitly-deleted copy constructor of 'std::atomic<bool>'
std::atomic<bool> n2 = n1;
^ ~~
note: copy constructor of 'atomic<bool>' is implicitly deleted because base class '__atomic_base<bool>' has a deleted copy constructor
note: '__atomic_base' has been explicitly marked deleted here
__atomic_base(const __atomic_base&) = delete;
如果这样做的唯一目的是重置A
的成员,那么只需创建一个重置函数void reset()
并将成员重置为其初始值。
void reset()
{
m = false;
n = false;
}
然后在void alpha()
做:
void alpha()
{
aval.m = false;
aval.reset();
}
以上是计划A.作为计划B,您可以使用智能指针(std::unique_ptr
)来保存aval
。然后你可以简单地reset
指针。
所以不要使用堆栈:
A aval;
你使用堆:
...
std::unique_ptr<A> aval;
public:
X() : aval(std::make_unique<A>())
{;}
void alpha()
{
aval->m = false;
aval.reset(new A());
}
我个人喜欢第一种方法。考虑一下这样一个事实,即无论它的“名称”构造函数如何“,构造函数都不会构造任何东西。它所做的只是初始化类的成员。这正是reset()
所做的,你使用堆栈。
以上是关于在C ++ 11中重置struct值的主要内容,如果未能解决你的问题,请参考以下文章