重置 C++11 中的结构值
Reset struct values in C++11
看起来这个问题已经被问了几次,但我似乎无法根据现有的答案和指导让它工作。
代码如下:
#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 中查找和更新向量中的一个嵌套结构
- C++11-在结构向量中修改结构的成员
- 如何在 C++11 编译时构建具有递增值的整数成员的结构序列
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- 重置 C++11 中的结构值
- C++11 如何将结构重置为 null?
- 在旧的 c++ (<c++11) 中,初始化结构会出错
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- C++11 中的不可变"functional"数据结构
- 如何在编译时计算c++11中的结构填充
- 用C++11中的智能指针包装旧的C结构并自动释放它们
- 在C 11中具有哈希地图结构的最直接侵略是什么
- 为什么C 11支撑初始化与基于堆栈的类层次结构一起起作用
- 如何在 C++11 中创建结构的编译时常量实例
- 结构向量和迭代C++11
- 扩展typedef结构(与VC++11兼容)
- 如何在C++11中将结构中的指针初始化为null
- 为什么不能在C++11或更高版本的函数声明中定义结构
- 在 c++11 中对结构数组进行大括号初始化
- 类编译中的静态结构C++11,为什么不链接?