Хранение списка произвольных объектов в C ++ - PullRequest
7 голосов
/ 03 марта 2009

В Java вы можете иметь список объектов. Вы можете добавлять объекты нескольких типов, затем извлекать их, проверять их тип и выполнять соответствующие действия для этого типа.
Например: (извиняюсь, если код не совсем правильный, я ухожу из памяти)

List<Object> list = new LinkedList<Object>();

list.add("Hello World!");
list.add(7);
list.add(true);

for (object o : list)
{
    if (o instanceof int)
        ; // Do stuff if it's an int
    else if (o instanceof String)
        ; // Do stuff if it's a string
    else if (o instanceof boolean)
        ; // Do stuff if it's a boolean
}

Какой лучший способ воспроизвести это поведение в C ++?

Ответы [ 13 ]

0 голосов
/ 03 марта 2009

RTTI (информация о типе времени выполнения) в C ++ всегда была сложной, особенно кросс-компилятор.

Вам лучше всего использовать STL и определить интерфейс для определения типа объекта:

public class IThing
{
   virtual bool isA(const char* typeName);
}

void myFunc()
{
   std::vector<IThing> things;

   // ...

   things.add(new FrogThing());
   things.add(new LizardThing());

   // ...

   for (int i = 0; i < things.length(); i++)
   {
       IThing* pThing = things[i];

       if (pThing->isA("lizard"))
       {
         // do this
       }
       // etc
   }
}

Mike

0 голосов
/ 03 марта 2009

Краткий ответ ... вы не можете.

Длинный ответ ... вам нужно определить собственную новую иерархию объектов, которые все наследуют от базового объекта. В Java все объекты в конечном итоге происходят от «объекта», что позволяет вам делать это.

0 голосов
/ 03 марта 2009

Ну, вы можете создать базовый класс, а затем создать классы, которые наследуются от него. Затем сохраните их в std :: vector.

...