存储和检索未经类型的未知类型的对象

时间:2012-07-25 15:25:34

标签: c++ oop design-patterns

假设:

A类的对象包含一个对象数组。

这些对象中的每一个都必须实现一些接口IB,因为A使用IB的方法。

这些对象由客户端传递给A类的对象,它们是C类或其子类。必须将这些对象返回给客户端。

问题:A必须对C一无所知,只有IB,但A必须返回C.

C ++中是否有任何标准解决方案没有不安全的强制转换<>?

2 个答案:

答案 0 :(得分:0)

我不认为A不知道关于C任何,这是可能的。但是,让A足够了解使用正确的接口在C ++中并不难。所有具有IB的类都派生自单个抽象基类,其中接口定义为纯虚函数。这实际上对应于适当的C ++设计 - 将接口与实现分离 - 如在例如Sutter & Alexandrescu

否则,如果以上情况确实不可能,您可以使A成为模板类,并将数组元素存储为void*,使用{{1}解析类类型(在编译时) }。

答案 1 :(得分:0)

您可以使用模板实现完全安全的类。

template  <typename T>class A
{
    std::vector<IB*> myObj;

public:


    void add(IB* anObj)
    {
        myObj.push_back(anObj);
    }

    void get(int anIndex, T*& anObj)
    {
        T* t = dynamic_cast<T*>(myObj[anIndex]);
        anObj = t;
    }
};

然后像这样使用。

A<C> a;

演示给出了here