0

constメンバー、constポインター、およびenumクラスメンバーを持つクラスがあります。

以下のサンプルコードに関する私の質問:

  1. 移動コンストラクターで「other」`の列挙型クラスメンバーを適切にnuliffyする方法(それに割り当てる値は?)
  2. 移動コンストラクタで「other」のconstポインタを無効にして、otherのデストラクタが構築中のオブジェクトのメモリを削除しないようにし、ポインタが有効になるようにするにはどうすればよいですか?
  3. 他のデストラクタが呼び出されないように、moveコンストラクタの「other」の定数メンバーを無効にする方法は?

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 *constyとして宣言されたポインタのアドレスを変更することはできません。

于 2012-04-26T15:30:34.197 に答える