在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值的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段外部清除/重置地图?

c++11初始化struct数组

C ++中的结构构造函数?

c ++ std :: sort intel编译器错误:访问冲突

切换片段时导航重置

如何在 Django 中显式重置模板片段缓存?