zdravím, mám v C++Builderu funkci s parametrem TObject *Sender a chci zjistit jeho přesnější typ. Jenže typeid(*Sender).name() vrací "TRichEdit", ale typeid(TRichEdit).name() vrací "Comctrls::TRichEdit", takže se to sobě nerovná.
if (typeid(*Sender) == typeid(TRichEdit)) { //nepravda :-(
//...
}
Fórum › C / C++
Problém s typeid
Zkusit to orezat o tu prvni cast Comctrls:: a porovnat zbytek???
No, ja mam taky pocit ze by sa tak kompilator nemal chovat. Mozes, prosim ta, spustit tento kod alebo nejakym sposobom objasnit situaciu lebo sa to snazim zreprodukovat ale nedari sa mi (na GNU g++). Popr. ak ten kod nie je podobny tvojej situacii tak ma oprav.
#include <iostream>
#include <typeinfo>
using namespace std;
class Base {virtual void poly() {} };
namespace test {
class der : public Base {};
}
using namespace test;
void fun(Base *b) {
cout << typeid(*b).name() << endl;
cout << typeid(der).name() << endl;
cout << (typeid(*b) == typeid(der)) << endl;
}
int main() {
der *d = new der();
fun(d);
delete d;
return 0;
}
Když upravím Vaši funkci main() a zadám do parametru fun() objekt typu Base (nikoli der), vypíše mi to různé názvy tříd a výraz vrátí nulu (v C++Builderu i pod Dev-C++ s kompilátorem Mingw).
int main() {
Base *b = new Base();
fun(b);
delete b;
return 0;
}
Pro metodu name() od typeid není ve standardu definováno, co musí vracet. Že je to nějaký unikátní název je jenom doporučení. Takže pokud bude překladač vracet prázdný řetězec, tak je to pořád v pořádku (pominu diskuse, k čemu ta metoda pak je).
Takže buď porovnat jedno typeid s druhým (jak má na konci funkce fun nikto, nebo použít dynamic_cast. Tím se sice neodhalí konkrétní instance, ale většinou to stačí.
To nikto : Ano, máte pravdu. Asi jsem to pořádně nedočetl do konce. Pak souhlasím s tím, že to vypadá na bug v překladači.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Únik paměti a typeid() — založil Jan
Problém — založil pali6
Problém v C — založil Robin
Moderátoři diskuze