3

クラス内のすべてのインスタンスに一意の ID を作成しようとしましたが、後でプログラムをコンパイルしようとするとエラーが発生するようです。これは私がクラスのために書いたコードです:

//this is GameObject.h
class GameObject
{
public:

    int instances;
    GameObject();
    void Display();
protected:
    int id;
};

//this is GameObject.cpp
#include "GameObject.h"
#include <iostream>

using namespace std;


GameObject::GameObject()
{
    instances = this->id; //is this the correct way to generate the unique id?

}
4

3 に答える 3

6

次のようにします。

class GameObject
{
public:
    int id;
    GameObject() : id(++s_id) {}
protected:
    static std::atomic<int> s_id;
};

// in the .cpp file:
std::atomic<int> GameObject::s_id;

このようにして、構築された各オブジェクトは、1 から始まる次の ID を取得します (静的はデフォルトでゼロに初期化されるため)。おそらく、どの値から開始するかは問題ではありません。コピー コンストラクターや代入演算子などを記述するときは注意が必要です。最後に、アトミック型は C++11 の一部であることに注意してください。サポートされていない場合は、「std」の代わりに「boost」と言うことができます。どちらのバージョンでも、必要に応じてスレッド セーフが提供されます。

于 2013-02-12T11:36:34.173 に答える
4

いいえ、 の各インスタンスにGameObjectは、 の独自の (初期化されていない) インスタンスがありidます。のすべてのインスタンスで使用できる共有のインクリメントidインスタンスが必要ですGameObject。これを達成するためのメカニズムの 1 つは、staticクラス変数を使用することです。staticスレッドが関係している場合は、変数へのアクセスを同期する必要があります。

class GameObject
{
protected:
    static int id;
};

int GameObject::id; // defaults to zero and should be added to
                    // exactly one .cpp file only.

GameObject::GameObject() : instances(GameObject::id++) {}

別の代替手段は、次を使用することboost::uuidです。

#include <string>
using std::string;

#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;

class GameObject
{
public:
    string instances;
    GameObject() : instances(make_uuid_());
    void Display();
private:
    string make_uuid_()
    {
        return lexical_cast<string>((random_generator())());
    }
};
于 2013-02-12T11:31:20.317 に答える
2

一意の値ではなく、不確定な値(初期化されていないidため)を持っているだけなので、これは正しくありません。

オブジェクトを一意の識別子としてアドレス指定できます。C++ の各オブジェクトは、異なるアドレスに配置されます。ただし、この方法で各オブジェクトを識別する必要がある場合は、設計に問題があります。

于 2013-02-12T11:31:21.360 に答える