重置 C++11 中的结构值

Reset struct values in C++11

本文关键字:结构 C++11 重置      更新时间:2023-10-16

看起来这个问题已经被问了几次,但我似乎无法根据现有的答案和指导让它工作。

代码如下:

#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()所做的,您可以使用堆栈。