13

Dataオブジェクトがそれぞれ一意の ID を持つクラスを作成しようとしています。

最初のオブジェクトの ID を 1 に、2 番目のオブジェクトの ID を 2 に、などとします。 を使用する必要がありますstatic intが、すべてのオブジェクトの ID は同じであり、1、2、3 ではありません...

これはDataクラスです:

class Data
{
private:
   static int ID;
public:
   Data(){
   ID++;
   }
};

最初のIDが1、2番目のIDが2などになるようにするにはどうすればよいですか?

4

5 に答える 5

22

これ:

class Data
{
private:
   static int ID;
   const int currentID;
public:
   Data() : currentID(ID++){
   }
};

静的カウンターの他に、インスタンスにバインドされたメンバーも必要です。

于 2012-06-04T12:41:25.323 に答える
13

ID が静的な場合、すべてのクラス インスタンスで同じ値になります。

各インスタンスに連続した id 値を持たせたい場合は、次のように static 属性をクラス変数と組み合わせることができます。

class Data
{
private:
   static int ID;
   int thisId;
public:
   Data(){
   thisId = ++ID;
   }
};

int Data::ID = 0;

アプリケーションがマルチスレッドになる場合は、pthread ミューテックスのようなものと同期する必要があります。

于 2012-06-04T12:39:58.240 に答える
3

関数内の静的変数の初期化が許可されているため、ソリューションは次のようになります

 class Data
 {
    private:
    static int ID ()
    {
       static int ID = 0;
       return ID ++;
    }
    int myId;

    public:
    Data(): myId (ID ())
    {      
    }
 };
于 2016-03-05T14:38:54.720 に答える
1

の各インスタンスにDataは、その ID を格納する独自の非静的メンバー変数が必要です。のstaticコンストラクターでインクリメントされる、最後に使用された ID を格納するために変数を使用できますData

staticスレッドセーフではないカウンターの代わりに、ブーストの uuid の使用を検討してください。

#include <boost/lexical_cast.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>

using boost::lexical_cast;
using boost::uuids::uuid;
using boost::uuids::random_generator;

std::string id_ = lexical_cast<std::string>((random_generator())());
于 2012-06-04T12:41:34.013 に答える
0

インスタンス (非静的) ID はどこにありますか? このように新しいインスタンス ID フィールドを宣言する必要があります

int m_ID;

次に、コンストラクターで

Data(){m_ID = ::InterlockedIncrement(&ID);}

インターロックまたはその他のスレッドセーフな方法で

于 2012-06-04T13:29:56.777 に答える