对于我的问题的技术部分,我得到了一个很好的答案,即为什么我目前的处理方法不起作用(分配derived**
给base**
是类型不安全的,另请参阅将 Derived** 转换为 Base** 和 Derived* 到 Base*)。但是,我仍然不知道如何以 C++ 方式实现我的想法。我开始一个新问题,因为最后一个标题太具体了。
这可能是对我正在尝试做的事情的更清晰的解释:
- 创建多个对象,这些对象都是从一个类派生的类的实例。
- 将这些对象与编译时人类可读的标识符(可能是字符串?)一起存储在某种类型的主容器中。
- 从其他组件获取标识符列表,搜索主容器,并将它们传回(指针/引用)相应的对象,以便它们可以读取/修改它们。我认为此时我需要打破类型安全,并假设组件知道它们通过标识符请求的派生类型。
我认为这对于映射、向量和指向对象的指针来说会相对简单和优雅(我在上一个问题中给出了一个简化的示例),但似乎我将不得不做很多 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;
}