Domanda

C'è un modo per controllare cosa è il tipo_info di una superclass? Negli oggetti del sistema sono identificati da un set di bit.Che è identificato dall'ashcode Type_info.Vorrei alcuni di questi tipi per abilitare il polimorfismo in una sensazione che il mio sistema pensa di essere sotto lo stesso bit.Type_info crea un hashcode unico per ogni tipo di classe.Invece voglio che le classi derivate prendano il bit set della loro superclasse come:

Component > ISomeInterfaceComponent -> bit = 00001
              |
               \ ComponentContextA  -> bit = ISomeInterFaceComponent bit
              |
              \  ComponentContextB  -> bit = ISomeInterFaceComponent bit
              |
              \  ComponentContextC  -> bit = ISomeInterFaceComponent bit
.

Questo dovrebbe aggiungere l'oggetto contenente i componenti a un sistema per l'elaborazione.

A partire da adesso questo è ciò che succede:

Component > ISomeInterFaceComponent -> bit = 00001
              |
               \ ComponentContextA  -> bit = 00010
              |
              \  ComponentContextB  -> bit = 00100
              |
              \  ComponentContextC  -> bit = 01000
.

che richiede di creare diversi sistemi per tutti i componenti.

Se qualcuno potrebbe darmi puntatori su come potevo ottenere questo sarebbe fantastico.

Modifica: Per evitare confusione per ottenere un po 'impostato per un tipo che va come segue: Componenttypemanager :: getbit ();

Quindi non sto lavorando con i istanze.E mi piacerebbe mantenere il sistema attuale in blocco.

È stato utile?

Soluzione

Non c'è alcun modo automatico di cui sono a conoscenza.Tuttavia, se ti capisco, può essere fatto tramite poco sforzo aggiuntivo.

Per ciascuna delle lezioni di "base", aggiungi un typedef che si riferisce a se stesso e utilizzare che invece nel typeid().Nota, le sottoclassi potrebbero scegliere di sovrascriverla.Se lo fanno, allora otterranno il proprio ID, e i loro figli useranno il loro valore.

Nota, un'altra soluzione, se non si desidera utilizzare typeid() è affatto per avere un membro statico (o una funzione membro) sulle classi di base che restituisce il valore corretto per la base, e quindi invocano che direttamente nel tuoGetbit () Funzione.

#include <iostream>
#include <iomanip>
#include <typeinfo>

struct Base1 
{
   typedef Base1 Base;

};

struct Base2
{
   typedef Base2 Base;
};

struct Derived1A : public Base1 { };   
struct Derived1B : public Base1 { };    
struct Derived2A : public Base2 { };    
struct Derived2B : public Base2 { };

template <typename T>
std::size_t getBit()
{
   // Do whatever you normally do here, but use T::Base instead of T
   return std::hash<std::string>()(typeid(typename T::Base).name());
}

int main()
{ 
   std::cout << std::boolalpha << getBit<Derived1A>() << " == " << getBit<Derived1B>() << " " << (getBit<Derived1A>() == getBit<Derived1B>()) << "\n";

   std::cout << std::boolalpha << getBit<Derived2A>() << " == " << getBit<Derived2B>() << " " <<(getBit<Derived2A>() == getBit<Derived2B>()) << "\n";

}
.

http://ideone.com/6ad08

Altri suggerimenti

Perché non solo creare una variabile nella classe base ISomeInterFaceComponent che non viene modificata da qualsiasi classe derivata (a meno che non lo desideri specificamente).Non sembra che tu voglia il polimorfismo come si desidera che il valore del bit sia il stesso indipendentemente dal tipo di classe derivato, anziché variare in base al tipo.Se in futuro è necessario scavalcare se per un determinato tipo derivato, è comunque possibile farlo specificamente per quella classe.

In alternativa è possibile utilizzare una funzione virtuale nella classe base che restituisce un INT (il valore di bit - o qualsiasi altro tipo è in realtà) e semplicemente non lo sovrascrive nelle classi derivate che si desidera avere lo stesso valore di bitla base.

Ad esempio

 class ISomeInterFaceComponent {
      virtual int GetBit() { return 1;};  // return bit value
 };


 class ComponentContextA : public ISomeInterFaceComponent {
      // Do not override GetBit() - let the base class function get called.
 };
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top