2012-04-26 5 views
0

私は怒鳴るconstメンバ、のconstポインタと列挙型クラスのメンバを持つクラス、C++コンストラクタと定数メンバポインタまたは定数メンバの移動、メモリリークを避けるためにそれらをヌル化する方法は?

サンプルコードのための私の質問があります。

`で「その他」の列挙型クラスのメンバーをnuliffyする方法
  1. を移動先のコンストラクタ
  2. 移動コンストラクタで "その他"のconstポインタを無効にする方法 他のデストラクタは、 が構築されているオブジェクトのメモリを削除しないようにします。ポインターが有効になるように?
  3. 移動コンストラクタで "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; 
}; 
+0

特別なケースとして0を使用して、enumを1から始めることができますか? – PlasmaHH

+0

@ PlasmaHHどのように役立つだろうか?私は20分も費やしていますが、私のポストでこのコードタグを解決することはできません。ただ機能しません。 – codekiddy

+1

値を変更したい場合は、単にconstにすることはできません。それは簡単です。 –

答えて

0

あなたは非ポインタ型を無効化を心配する必要はありません。それらのデータは、ヒープ上ではなくクラスの内側にあるため、複数回「解放」することはできません。あなたのconst intポインターは無効にする必要があり、あなたはそのようなことをしているように見えます。 http://msdn.microsoft.com/en-us/library/dd293665.aspx

EDIT:あなたはint型* constのyを宣言した場合

、あなたがconstのようにポインタを宣言している

は、より多くの情報のため、このMDSNの記事を見てみましょう。単純にintをconstにしたい場合は、const int * yと宣言してください。 int * const yとして宣言されたポインタのアドレスは変更できません。

+0

提供されているMSDNの記事では、** const **のメンバーを使用していないため、私の質問は説明されていません。コードがコンパイルされないので、私は正しくやっていません:D – codekiddy

+0

ああ、そこのconst部分全体を逃した。 int * const yを宣言すると、ポインタがconstであると宣言しています。単純にintをconstにしたい場合は、const int * yと宣言してください。 int * const yとして宣言されたポインタのアドレスは変更できません。 – gcochard

+0

ポインタ以外の型は解放することはできませんが、移動が発生した後も_valid_状態で存在し続けることはできません。 –

関連する問題