문제

수퍼 클래스의 type_info가 무엇인지 확인하는 방법이 있습니까? 시스템 객체에서는 비트 세트로 식별됩니다.type_info 해시 코드로 식별됩니다.이러한 유형 중 일부는 내 시스템이 동일한 비트에 있다고 생각하는 의미에서 다형성을 가능하게합니다.type_info 모든 클래스 유형에 대해 고유 한 해시 코드를 만듭니다.대신 파생 된 클래스가 수퍼 클래스의 비트 세트를 그렇게 할 수 있도록 :

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

이렇게하면 구성 요소가 포함 된 객체가 처리를 위해 하나의 시스템에 추가해야합니다.

지금 당장 이것은 일어난 일입니다.

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

모든 구성 요소에 대해 서로 다른 시스템을 만드는 것을 요구합니다.

누군가가 내가 이것을 어떻게 달성 할 수 있는지에 대한 포인터를 줄 수 있다면

편집 : 혼란을 방지하기 위해 유형에 대해 비트 세트를 가져 오는 것은 다음과 같습니다. componentTypeManager :: getBit ();

그래서 나는 인스턴스와 함께 작동하지 않습니다.그리고 현재 시스템을 잠금 장치에 보관하고 싶습니다.

도움이 되었습니까?

해결책

내가 알고있는 자동 방식이 없습니다.그러나 내가 당신을 이해하는 경우, 그것은 약간의 추가 노력을 통해 수행 될 수 있습니다.

'기본'클래스 각각에 대해 자체를 참조하는 TypEndEF를 추가하고 typeid()에서 대신 사용할 수 있습니다.하위 클래스는 재정의를 선택할 수 있습니다.그들이 그렇게하면, 그들은 자신의 ID를 얻을 것이고, 자녀들은 그들의 가치를 사용할 것입니다.

메모, 다른 해결책은 전혀 typeid()를 사용하지 않으려는 경우 기본 클래스의 정적 멤버 (또는 멤버 함수)를 사용하여 기본 클래스에 기본 클래스를 가져 와서 바닥에 적절한 값을 반환 한 다음 직접 해당합니다.getbit () 함수.

#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

다른 팁

파생 된 클래스에 의해 수정되지 않은 기본 클래스 ISomeInterFaceComponent에서 변수를 만드는 것이 아닙니다 (특별히 원하는 경우가 아닌 경우).형식에 따라 다르지 않고 파생 클래스 유형에 관계없이 비트 값이 같은 에 관계없이 다형성을 원하는 것처럼 들리지 않습니다.앞으로도 특정 파생 유형에 대해 재정의 해야하는 경우 해당 클래스에 대해 특별히 수행 할 수 있습니다.

또는 int (비트 값 - 또는 실제로 어떤 유형이든)를 반환하는 기본 클래스에서 가상 함수를 사용할 수 있으며 동일한 비트 값을 가진 파생 클래스에서 파생 된 클래스에서 단순히 재정의하지 않는 경우기지.

예 :

 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.
 };
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top