鉴于:
A 类的对象包含一个对象数组。
这些对象中的每一个都必须实现一些接口 IB,因为 A 使用 IB 的方法。
这些对象由客户端传递给 A 类的对象,它们属于 C 类型或其子类。A 必须将这些对象返回给客户端。
问题:A必须对C一无所知,只知道IB,但A必须返回C。
C++ 中是否有没有不安全强制转换<> 的标准解决方案?
鉴于:
A 类的对象包含一个对象数组。
这些对象中的每一个都必须实现一些接口 IB,因为 A 使用 IB 的方法。
这些对象由客户端传递给 A 类的对象,它们属于 C 类型或其子类。A 必须将这些对象返回给客户端。
问题:A必须对C一无所知,只知道IB,但A必须返回C。
C++ 中是否有没有不安全强制转换<> 的标准解决方案?
您可以使用模板实现一个完全安全的类。
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;
演示在这里给出
我不认为这是A
不可能的。然而,在 C++ 中足够了解使用正确的接口并不难。让所有类都派生自一个抽象基类,其中接口定义为纯虚函数。这实际上对应于正确的 C++ 设计——将接口与实现分离——如Sutter & Alexandrescu中所述。C
A
IB
否则,如果上面确实不可能,您可以创建A
一个模板类,并将数组元素存储为void*
,使用 . 解析类类型(在编译时)static_cast
。