2012-07-25 41 views
0

已知:存储和检索未知类型的对象而无需强制转换

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

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

这些目的通过了由客户对象类A的,它们是类型C或它的孩子。必须将这些对象返回给客户端。

问题:一个肯定不知道关于C什么,只有约IB,但要求退还C.

是否有任何C标准溶液++没有不安全的类型转换<>?

+1

听起来像是你已经花了太多的时间编写Java。 C++没有与“class”分开的“接口”的概念。因此,IB必须是一个类,并且A可以简单地将一个(指针|引用)返回给IB。 C必须(显然)来自IB,但A不需要知道这一点。 – 2012-07-25 15:29:06

+0

这个答案可能会给你一些想法:http://stackoverflow.com/questions/7950711/conversion-from-subclass-to-superclass-to-subclass/7950896#7950896 – ssube 2012-07-25 15:30:37

+0

你说*不安全蒙上<> *仿佛' static_cast'等是不安全的。如果你正确使用它们,它们是完全安全的。 – chris 2012-07-25 15:31:28

回答

0

我不认为这是可能的A不知道什么东西C。然而,拥有A足够知道使用正确的界面在C++中并不那么困难。有IB所有类从具有定义那里作为纯虚功能的接口的单个​​抽象基类派生。这实际上对应于正确的C++设计 - 将接口与实现分离 - 例如, Sutter & Alexandrescu。否则,如果上述确实是不可能的,则可以使A为模板类,并将数组元素存储为void*,使用static_cast解析类类型(在编译时)。

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

相关问题