问题描述
|
这是一个面试问题:
我们如何存储假设彼此完全独立的3个不同类的对象。
我的回答是:
创建一个存储所有空指针的数组。
喜欢 :
void *array[];
并存储所有对象的指针。数组元素可以很多。
但是我说我们可以使用动态类型转换或静态类型转换来获取元素!
我认为这是错误的答案。我认为ѭ1和ѭ2应该在相关的类中使用。
如果我错了,请纠正我。
如果动态转换和静态转换均无效,则可以使用reinterpret cast
。
但这是执行此任务的正确方法吗?
解决方法
您为什么要使它变得如此复杂?
struct T {
T1 obj1;
T2 obj2;
T3 obj3;
};
如果相反,您意味着您拥有一个对象数组,并且每个元素可以属于三种不同的,不相关的类型,那么这是一个愚蠢的面试问题,因为这是一件愚蠢的事情。
(是的,如果由于有限的工作机会和迫切需要食用食物而被迫采用这种方法,您会考虑“ 5”。)
, 您可以使用boost::variant<myfoo,anotherfoo,somefoo> v
放入vector<v>
,然后可以在向量中为每个项目存储一个类,但是它可以存储所有三种类型的变量。
您可以在此处找到有关boost :: variant的更多信息
, 不允许从“ 9”中的“ 8”开始,您需要一个多态指针(即,指向其中具有“ 10”方法的类的指针)。
您无法使用其他演员表,因为该演员表的目标类型未知。一旦将类型化的指针转换为void*
,类型信息就会永远丢失。仅给出指针,您就没有机会找回该类型信息。您需要以某种形式记住一些有关类型的信息。 ѭ9旁边的ѭ12怎么样?
, 唯一的“正确”方法是使用类似
boost::variant
。如果您不能使用升压,那么您必须减少使用
做同样的事情:实现一个接受所有
所需的类型。这并不像看起来那样困难:对于POD类型,
您可以使用普通的union
进行数据显示;对于非POD类型,您
在联合中添加一个unsigned char x[sizeof(T)]
,并使用新的展示位置和
根据需要将其显式删除。然后添加任何必要的
工会,以确保对齐。因此,对于用户类型MyClass和double,
一个人可能会喜欢:
class MyVariant
{
public:
enum Type { t_double,t_MyClass };
private:
Type m_type;
union
{
double m_double;
unsigned char m_MyClass[sizeof(MyClass)];
MaxAlignFor<MyClass> m_dummyForAlignment_MyClass;
};
public:
MyVariant( double d )
: m_type( t_double )
{
m_double = d;
}
MyVariant( MyClass const& c )
: m_type( t_MyClass )
{
new (m_MyClass) MyClass( c );
}
~MyVariant()
{
switch ( m_type )
{
case t_double:
break;
case t_MyClass:
reinterpret_cast<MyClass*>( m_MyClass )->~MyClass();
break;
}
}
};
等等。 (显然还有很多事情要做,但这应该使
基本框架。)