Bir nesnenin en türetilmiş sınıfını, miras ağacındaki sınıflardan birinin yapıcısı içinde keşfetmeye çalışıyorum. Bu konuda birkaç saat harcadım ve başka nasıl yapabileceğimi ya da neden mantıklı gelmediğini kaybettim. Mükemmel bir his gibi görünüyor, ama işe yaramaz. RTTI hakkında çok sayıda sayfa buldum ve temelde hiçbir yerde onlarla birlikte olmadım. Test durumumdan ve çıktısından sonra açıklamaya devam edeceğim."Bu" işaretçisi RTTI etkin mi?
kaynak: (++ g üzerinde)
#include <iostream>
#include <typeinfo>
#include <string>
class A
{
public:
A(std::string foo);
virtual void bar(A* a) = 0;
};
class B : public A
{
public:
B();
virtual void bar(A* a);
};
A::A(std::string foo)
{
std::cout << "type as passed to A constructor: " << foo << " (" << this << ")" << std::endl;
std::cout << "type as determined in A constructor: " << typeid(*this).name() << " (" << this << ")" << std::endl;
}
B::B() : A(typeid(*this).name())
{
A* a = (A*)this;
std::cout << "type as determined in B constructor: " << typeid(*a).name() << " (" << this << ")" << std::endl;
this->bar(this);
}
void B::bar(A* a)
{
std::cout << "type as determined in bar: " << typeid(*a).name() << " (" << a << ")" << std::endl;
}
int main()
{
B b;
b.bar(&b);
return 0;
}
çıkışı:
type as passed to A constructor: 1B (0x7fff5fbff910)
type as determined in A constructor: 1A (0x7fff5fbff910)
type as determined in B constructor: 1B (0x7fff5fbff910)
type as determined in bar: 1B (0x7fff5fbff910)
type as determined in bar: 1B (0x7fff5fbff910)
yerine "1A" nın "1B" demek için çıktı ikinci satırını almaya çalışıyorum . RTTI, henüz hayal edemediğim bir nedenden dolayı "bu" dan ayrıldı mı? Bu sanal fonksiyonlar fikrini nasıl kırmaz? (Daha önce tanımadığım RTTI'nin bir kısmını yeniden keşfettiğimi keşfedene kadar bunu sanal işlevlerle uygulamıştım.) Çıktının gösterdiği gibi, “bunu” kullanmaktan kaçınırsam bu işi yapabilirim. Bunu yapmak tasarımla kırılmaya benziyor.
Neden bu türü algılamaya çalışıyorsunuz? Bu ungood. Bu başka bir şeye teşebbüs (kusurlu) bir çözüm gibi geliyor, başka bir şey nedir? –
Alf, std :: map türünde (std :: string, bu durumda) nesnelerin her bir türü harita içinde benzersiz bir nesneye sahip. Belirli bir sınıfın her bir örneğinin, yeni nesnelerin bu temel nesnelere kolayca eklenmesini ve daha sonra türüne göre alınmasını sağlamak için kendi haritası vardır. (Bunu, aynı nedenden ötürü eşdeğer bir başarısızlıkla, RTTI'yı bilmeden önce, const ints ve sanal yöntemlerle yapıyordum.) – Grault