0

我有一个类,它有一个常量成员、常量指针和枚举类成员,

我对以下示例代码的问题:

  1. 如何在移动构造函数中正确地取消“其他”的枚举类成员(分配什么值?)
  2. 如何在移动构造函数中使“其他”的常量指针无效,以便其他的析构函数不会删除正在构造的对象的内存,并且指针仍然有效?
  3. 如何在移动构造函数中使“其他”的常量成员无效,以免调用其他的析构函数?

enum class EnumClass
{
    VALUE0, // this is zero
    VALUE1
};

class MyClass
{
  public:
    MyClass() : 
        member(EnumClass::VALUE1),
        x(10.f),
        y(new int(4)) { }

    MyClass(MyClass&& other) : 
        member(other.member),
        x(other.x),
        y(other.y)
    {
        // Can I be sure that this approach will nullify a "member" and avoid
        // destructor call of other
        other.member = EnumClass::VALUE0;

        // Or shall I use this method?
        other.member = static_cast<EnumClass>(0);

        // ERROR how do I nullify "x" to avoid destructor call of other?
        other.x = 0.f;

        // ERROR the same here, delete is going to be called twice!
        other.y = nullptr;
    }

    ~MyClass() 
    {
        delete y;
    }

  private:
    EnumClass member;
    const float x;
    int* const y;
};
4

1 回答 1

0

您无需担心使非指针类型无效。它们不能被多次“释放”,因为它们的数据位于类内部,而不是堆上。你的 const int 指针确实需要被取消,看起来你做对了。

看看这篇 MDSN 文章了解更多信息:http: //msdn.microsoft.com/en-us/library/dd293665.aspx

编辑:

如果您声明一个 int* const y,则您将指针声明为 const。如果您只是希望 int 为 const,请将其声明为 const int* y。您不能更改声明为 int* const y 的指针的地址。

于 2012-04-26T15:30:34.197 回答