Могут ли указатели type_info использоваться для расстановки типов в C ++? - PullRequest
1 голос
/ 11 августа 2011

У меня есть набор полиморфных классов C ++, и все они создаются одним и тем же модулем (Windows DLL). Теперь имея два указателя на такие классы и вызвав typeid:

SomeCommonBase* first = ...; //valid pointer
SomeCommonBase* second = ...; //valid pointer
const type_info& firstInfo = typeid( first );
const type_info& secondInfo = typeid( second );

Могу ли я сравнить найденные type_info адреса

if( &firstInfo == &secondInfo ) {
   //objects are of the same class
} else {
   //objects are of different classes
}

или используйте ==

if( firstInfo == secondInfo ) {
   //objects are of the same class
} else {
   //objects are of different classes
}

чтобы определить, принадлежат ли объекты (точно) одному и тому же классу или разным классам? Гарантируется ли работа, когда объекты создаются из одного и того же модуля?

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Пока я пишу, ваш код

SomeCommonBase* first = ...; //valid pointer
SomeCommonBase* second = ...; //valid pointer
type_info& firstInfo = typeid( first );
type_info& secondInfo = typeid( second );

Он не должен компилироваться, поскольку typeid возвращает ссылку на const.

Хуже, вы запрашиваетевведите информацию об указателях.Оба указателя имеют тип SomeCommonBase*, поэтому вы гарантированно относитесь к одному типу.Вместо этого попросите информацию о типе указанных объектов.

При этом, как заметил @DeadMg, вам также нужно использовать operator== для сравнения объектов информации типа.

Стандарт C ++ нерешить проблему динамических библиотек.Но в любом модуле Windows вы должны быть в безопасности.

Cheers & hth.,

2 голосов
/ 11 августа 2011

Вы можете получить только const type_info ссылки, и вы всегда должны использовать operator==.

...