将三个不同类别的对象存储在数组中

问题描述

| 这是一个面试问题: 我们如何存储假设彼此完全独立的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;
        }
    }
};
等等。 (显然还有很多事情要做,但这应该使 基本框架。)