2016-04-11 4 views
0

新しく作成された特定のクラスのすべてのオブジェクトに一意のIDを割り当てたいが、コピーするクラスには割り当てない。私のようなものにできます。他のクラスのインスタンスに応じてstd :: vectorが特定のコンストラクタを呼び出す方法

int next_id = 0; // ugly global variable 

class Element { 
    int id; 
public: 
    Element(){ 
     this->id = next_id++; 
    } 
    Element(const Element &other){ 
     this->id = other.id; 
    } 
}; 

をし、それが、私はしかし、その代わりにグローバル変数を持つの

vector<Element> list; 

を行うことができますSTLライブラリで動作します、私は別のオブジェクトの内部NEXT_IDしておく必要があります。

class Context { 
    int next_id; 
public: 
    Element *createElement(){ 
     Element *element = new Element(this->next_id++); 
     return element; 
    } 
}; 

class Element { 
    int id; 
public: 
    Element(int id) : id(id) { 
    } 
    Element(const Element &other){ 
     this->id = other.id; 
    } 
}; 

だから私はこのようにそれを使用することができます。

Element *element = context->createElement(); 

しかし、私はベクトルと一緒に使用することはできません。

私はstd :: vectorに、

context->createElement()
のような関数、すなわち 'context'オブジェクトに依存する何らかの関数を使ってElementのコンストラクタを呼び出し、サイズ変更時には通常のコンストラクタを呼び出したいと思います。

これを行う方法はありますか?たとえば、ファンクタのインスタンスをベクターなどに渡すと、...

編集:ポイントを明確にする。新しいcontextオブジェクトを作成し、後でelementをこの新しいcontextに関連付けることによって、ユーザが新しい一連のIDを作成できるようにするために、別のContextクラスの使用について言及します。

class Element { 
    Context *context; 
public: 
    Element(Context *context) : context(context){ 
    } 
    Element(const Element &other){ 
     this->context = other.context; 
    } 
}; 

、それはコンストラクタを呼び出すときvectorcontextオブジェクトを指定する方法を探して:たとえば同等の問題は、このように見える要素のクラスを持っているだろう。

+2

最初の例を残して、 'next_id'を' Element'の 'static'メンバーにしてください。 – user657267

答えて

0

なぜ私は別のクラスにnext_idを持ちたいのですか?最も簡単な解決策は、Elementという固定メンバーnext_idを作成することです。

​​

これはトリックを行う必要があります。私はナンセンスだと思うカスタム "アロケータ"を持つ必要はありません。

idを持つ目標が複数のクラスを持ち、それらの間に一意のIDを持つ場合は、継承を使用してください!要素はすべてのサブクラスの父であり、あなたの完全にユニークなIDを処理します。

+0

私の問題は実際にはユニークなIDを持たないので、私の例は誤解を招くと思います。新しい 'Context'オブジェクトを作成することで、ユーザーが新しい一連のIDを開始できるようにします。私はその質問を明確にします。 –

0

標準ライブラリは、a.construct(p, args...)を呼び出すことによって、その要素を効果的に構築します。これに対応して、カスタムアロケータのconstruct()メンバを使用して、オブジェクトの構築方法をカスタマイズできます。このアプローチでは、カスタムアロケータが使用されている必要があります。この使用は、対応するクラスのコンストラクタをprivateにして、カスタムアロケータの構築にアプロッチを提供することで実施できます。

+0

しかし、アロケータはクラスです、ベクトルの宣言でアロケータに引数を渡すことは可能ですか? –

+0

@OnurCelebi:C++ 11のアロケータはステートフルです。必要なコンテキストをそこから参照することができ、アロケータはどこにでも渡されます。 –

+0

これらはベクトルの存続期間中にステートフルですが、ベクトルの宣言中に引数を渡す方法はありますか? –

関連する問題