C ++ получить тип объекта - PullRequest
       2

C ++ получить тип объекта

3 голосов
/ 27 октября 2011

У меня есть приложение C ++, которое имеет следующие классы:

  • class AAA
  • class BBB наследуется от AAA
  • class CCC наследуется от AAA
  • class DDD наследуется от CCC

(Все классы отмечены как public)

Теперь у меня есть следующая карта:

map <DWORD, AAA*> 

Я нахожу AAA объект в map, по DWORD id, но теперь я хочу знать, какой тип AAA:

это будет логика:

if(AAA is BBB)
{
...
}
if(AAA is CCC)
{
...
}
if(AAA is DDD)
{
...
}

Знаете ли вы, как написать это на C ++ (без добавления полиморфной функции getType())?

Ответы [ 2 ]

7 голосов
/ 27 октября 2011

Требование этого указывает на то, что вы делаете это неправильно.Вы пытаетесь воспроизвести что-то, для чего были изобретены виртуальные методы.Просто поместите виртуальный метод в ваш базовый класс.

class AAA
{
public:
    virtual void DoSomething() = 0;
}

class BBB : public AAA
{
public:
    void DoSomething() { ... }
}

class CCC : public AAA
{
public:
    void DoSomething() { ... }
}

class DDD : public AAA
{
public:
    void DoSomething() { ... }
}

И в вашем коде вызова ваша логика проста:

// no need for if() blocks. it's the point of virtual methods.
AAA* somePointer;
...
somePointer->DoSomething();

Я понимаю, что вы, возможно, не можете просто скопировать / вставитьВаш текущий кодекс "чего-то" в это.Но это шаблон , который вы должны использовать для этого сценария.Возможно, вместо DoSomething имеет больше смысла иметь что-то вроде GetSomeInfo, которое вызывающий может использовать для выполнения всего, что ему нужно.Конкретное использование этого шаблона зависит от вашего контекста.

4 голосов
/ 27 октября 2011

Если ваш объект полиморфный (т.е. имеет хотя бы одну виртуальную функцию), выполните dynamic_cast<T*>.

, если результат не NULL, тогда у вас есть объект типа T.Но виртуальная функция могла бы быть лучше для IMO.

Примечание: RTTI должен быть включен на вашем компиляторе (что будет в подавляющем большинстве ситуаций)

РЕДАКТИРОВАТЬ: Спасибо @Als и @flipchart за добавления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...