2017-04-23 6 views
2

作成されたすべてのオブジェクトに対して一意のIDを取得しようとしていますが、作成されたオブジェクトのインスタンス数も記録しています。しかし、デストラクタが呼び出され、カウンタが減ったときのように、IDが変わるようです。静的カウンタ - IDを変更しない方法[C++]

の.h

class Objekt 
    { 
    public: 
     Objekt(); 
    ~Objekt(); 

    int ID; 
    static int get_counter(); 

private: 
    static int counter; 

}; 

た.cppあなたはユニークなIDが必要な場合は、二つのカウンタを持っている必要があり

#include "Objekt.h" 



Objekt::Objekt() 
{ 
    counter++; 
    ID = counter; 
} 


Objekt::~Objekt() 
{ 
    --counter; 
} 

int Objekt::get_counter() 
{ 
    return counter; 
} 
+0

予期しない動作を示す[mcve]を提供できますか? – aschepler

答えて

1

:ライブオブジェクトの(1)の数と(2)の数をIDを作成するために作成されたオブジェクト。

ここでシステムは、重複したIDを持つオブジェクトを作成します。

+0

これは、重複IDについての良い点です。別のものが作成される前にオブジェクトが破壊されていない場合、プログラムはIDを適切に適用します。 –

+0

が働いた!ありがとうございました! – 5arg

1

IDからカウンタのアイデアを切り離します。

static int currentID; 

そして、ちょうどコンストラクタを変更します:クラスに追加

Objekt::Objekt() 
{ 
    counter++; 
    currentID++; 
    ID = currentID; 
} 

currentIDがために良いも(これまでに作成されたすべてのオブジェクトのカウントを保持する一方でカウンターが今、生きているオブジェクトの数を開催しますIDを取得する)。

0

あなたが書いたIDは、実際には最終的に再利用されて台無しになるオブジェクトインスタンス番号です。代わりに非減少の合理的に大きな(uint64)カウンタを使用するか、::boost::uuid for exampleによって生成されたより現実的なIDを使用するように切り替えることができます。デストラクタが呼び出されると、カウンタが減少する

class Objekt 
{ 
    public: 
    Objekt(): m_id(::boost::uuids::random_generator()()) {} 

    public: 
    ~Objekt() {} 

    private: ::boost::uuids::uuid const m_id; 
}; 
0

、それとID 変化します。

2つのカウンタctorとdtorを使用することをお勧めします。

class Objekt 
{ 
public: 
    Objekt() 
    { 
     ctorCount++; 
     ID = ctorCount; 
    } 

    ~Objekt 
    { 
     dtorCount++; 
    } 
    int activeInstances() { return (ctorCount - dtorCount); } 
    int maxInstanceId() { return (ctorCount); } 
    int staleInstances() { return (dtorCount); } 

private:  
    static int ctorCount; // accessible by all instances 
    static int dtorCount; 

}; 



int Objekt::ctorCount = 0; 
int Objekt::dtorCount = 0; 

インスタンスが削除されると、IDは変更されず、次のIDは常に一意です。

ID間のギャップが発生する可能性があることに注意してください。 activeInstances()の数は正確ですが、特定のIDやmax(maxInstanceId()でアクセス可能)には計算されません。

関連する問題