2017-10-22 15 views
1

私のオブジェクトごとにユニークなIDを生成するのに問題があります。C++一意のIDを生成する

私のオブジェクトは、私は私のsong.cppファイルに

private: 
    int m_ID; 
    static unsigned int IDSeed; 

を持っている曲のオブジェクトの魔女は、変数のアーティスト、ジャンルなど民間の下で私のsong.hでとても

ファイルを持っています私が持っている

私が今得ている主なエラーは"u解決済みの外部シンボルprivate static unsigned int Song :: IDSeed "

+0

デフォルトのコンストラクタ( 'Song a; Song b; Song c;')ですべてを構築すると、すべてのIDがゼロに設定されます。 –

+0

私のsong.hファイル内の私は私が持っている_私はあなたの曲クラス宣言だけを表示しないのですか?第2に、 'static unsigned int IDSeed;'はunsigned int IDSeed = 0;と異なります。 – Amadeus

+1

オブジェクトのメモリアドレス( 'reinterpret_cast (this)')をユニークなものID?生存している2つのオブジェクトはアドレスを共有することはありません(オブジェクトは過去のアドレス、現在は死んでいるアドレスを再利用しているかもしれませんが)。 –

答えて

1

からstatic unsigned int IDSeed;を削除することができ、そして、それは静的に宣言する必要があります。

class Song { 
    int m_ID; 
    static unsigned int IDSeed; 
    static int helper_seed() { IDSeed++; return IDSeed;} 
    (...) 
}; 

今、あなたはあなたの静的メンバを初期化する必要があります。だから、あなたのsong.hファイルに、あなたはそのような何かを持っている必要があります。だから、song.cppに:

unsigned int Song::IDSeed = 0; 

さて、Songオブジェクトの各コンストラクタに、あなたはこのような何かを行うことができます。

Song::Song() 
{ 
    m_ID = helper_seed();  
} 

Song::Song(constructor variables) 
{ 
    m_ID = helper_seed(); 
} 
+0

今、 "静的なunsigned intソング:: IDSeed = 0;"ストレージクラスがここで指定されていない可能性がありますエラーが表示されます –

+0

ありがとうございました。これを動作させるには、song.cppのIDSeedからstaticキーワードを削除しなければなりませんでした。 –

0

コードにstatic unsigned int IDSeed;は何もしません。 unsigned int IDSeed = 0;は "usuall"クラス(インスタンス)変数で、クラスを初期化するたびにゼロに設定されます。永続的な値を使用する場合は、この変数を静的にする必要があります。 IDSeedSongオブジェクト間で同じでなければならないように私には思えるとしても、あなたがSong()

+0

私はそれを行うときにエラーが発生する "クラス内のイニシャライザを持つメンバはconstでなければならない"静的なunsigned intの前にconstを置くと、 "++はna I_Valueを必要とする"というエラーが発生する –

1

あなたは、オブジェクトのメモリアドレスを使用することができます - をreinterpret_cast<std::uintptr_t>(this) - 一意のIDとして、IDは現在のすべての生きているオブジェクトの中で一意でなければなりません。

2つのオブジェクトが存続することはありません(ただし、オブジェクトは過去のアドレス、現在は無効なアドレスを再使用している可能性があります)。

関連する問題