在C ++对象之间分发共享数据

时间:2013-07-25 01:21:17

标签: c++ constructor shared-ptr

我正在尝试构建一堆可以共享数据的对象,但不会相互耦合。我想要的是每个对象的字段对于他们需要的任何数据都是shared_ptr。一旦创建了所有对象,这将满足我的所有需求,但我的问题是如何分发创建shared_ptr所需的信息,因为类型可以是任何类型。

我将在工厂对象中一次创建共享一组数据的所有对象。此外,每个共享字段都有一个枚举条目来表示属性类型(不是数据类型)。例如,枚举将具有Position的条目,并且需要位置信息的每个对象将使用枚举键入地图以查找创建shared_ptr所需的信息。

我想从我的系统中得到的是:

  1. SetEnum传递给工厂,工厂定义要创建的对象的“集合”,以及定义对象集的初始数据的可选map<AttributeEnum, ??>
  2. 创建必要的对象,使用map<AttributeEnum, ??>创建shared_ptr作为每个对象中的字段。如果对象需要与特定值AttributeEnum对应的字段,则它将从地图中提取其值。如果该值不是映射中的键,则它将使用默认值创建它,并将其添加到地图以供将来使用的对象使用。如果具有模板类型的方法有助于解决问题,则可以在构造期间或之后完成此步骤。
  3. 问题是我在编译时需要错误,而不是运行时。如何将AttributeEnum映射到某个类型?例如,与AttributeEnum Position值对应的每个字段都将具有类型shared_ptr<double>,但如果我尝试将Position与例如shared_ptr<int>关联,则我想要编译错误std::map<Enum, shared_ptr<void> >。我的问题是如何解决这个问题?

    我想到的几个不同的系统(尽管它们都不能确保编译时的错误):

    1. 传递shared_ptr并静态将AttributeEnum投射到相应的类型。
    2. 构造对象,然后遍历Enum,检查每个对象所需的属性,然后将适当的指针传递给它。
    3. 让一个对象“拥有”每个属性,并强制另一个通过消息传递系统获取信息。
    4. 我正在考虑存储两个并行数据集,Position具有条目#define POSITION double,以及编译器常量将定义类型POSITION,然后我只使用{{ 1}}对于我必须的类型,但这会使代码更难阅读。

0 个答案:

没有答案