これに対する私の現在のアプローチが機能しない理由について、私の質問の技術的な部分に対して良い答えを得ました(derived**
への代入base**
はタイプセーフではありません。Derived** から Base** への変換および Derived* から Base* への変換も参照してください)。ただし、考えていることを C++ の方法で実装する方法については、まだよくわかりません。最後のタイトルが具体的すぎたので、新しい質問を開始します。
これはおそらく、私がやろうとしていることのより明確な説明です:
- 1 つのクラスから派生したクラスのすべてのインスタンスである多数のオブジェクトを作成します。
- これらのオブジェクトを、コンパイル時の人間が読み取れる識別子 (おそらく文字列?) と共に、ある種のマスター コンテナーに格納します。
- 他のコンポーネントから識別子のリストを取得し、マスター コンテナーを検索して、それらを対応するオブジェクトに (ポインター/参照として) 返し、読み取り/変更できるようにします。この時点で型安全性を破る必要があると思います。コンポーネントは、識別子によって要求している派生型を知っていると仮定します。
これは、マップ、ベクトル、およびオブジェクトへのポインターを使用するのに比較的単純でエレガントだと思いました (前の質問で単純化した例を示します) が、多くの C-スタイルの型キャストを使用して、コンポーネントがポインタを場所に渡してマスター コンテナからの値を格納できるようにします。これは、私が C++ パラダイムに従っていないことを示していますが、何を「すべき」でしょうか?
[編集] 以下は、私がこれをどのように想定したかについての架空のサンプル コードです。これが私の考えを明確にすることを願っています。
#include <map>
#include <vector>
#include <string>
using namespace std;
class BaseObj {};
class Der1Obj: public BaseObj {};
class Der2Obj: public BaseObj {};
typedef map<string, BaseObj**> ObjPtrDict;
typedef map<string, BaseObj*> ObjDict;
class BaseComp
{
public:
ObjPtrDict objs;
};
class DervComp
{
DervComp(){objs["d1"] = &d1; objs["d2"] = &d2; } // This wouldn't compile
Der1Obj* d1;
Der2Obj* d2;
}
typedef vector<BaseComp*> CompList;
void assign_objs(CompList comps, ObjDict objs)
{
for (auto c = comps.begin(); c != comps.end(); c++)
for (auto o = c.objs.begin(); o != c.objs.end(); o++)
*(o->second) = objs[o->first];
}
int main(int argc, char* argv[])
{
Der1Obj d, d1;
Der2Obj d2;
ObjDict objs;
objs["d"] = &d;
objs["d1"] = &d1;
objs["d2"] = &d2;
DervComp c;
vector<DervComp*> comps;
comps.push_back(&c);
assign_objs(comps, objs);
return 0;
}