C++에서 흥미로운 문제가 있었지만 아키텍처에 대한 자세한 내용이었습니다.C++ 동적 유형 구성 및 검색
는, 예를 들어 일부 특성 (MIX-클래스)를 설명하는 많은 (10, 20, 40 등)의 클래스가있다 :
struct Base { virtual ~Base() {} };
struct A : virtual public Base { int size; };
struct B : virtual public Base { float x, y; };
struct C : virtual public Base { bool some_bool_state; };
struct D : virtual public Base { string str; }
// ....
기본 모듈 선언하고 단순 단지 함수 (기능 수출 수업이없는 선언) :
// .h file
void operate(Base *pBase);
// .cpp file
void operate(Base *pBase)
{
// ....
}
다른 모듈은 다음과 같은 코드를 가질 수 있습니다
#include "mixing.h"
#include "primary.h"
class obj1_t : public A, public C, public D {};
class obj2_t : public B, public D {};
// ...
void Pass()
{
obj1_t obj1;
obj2_t obj2;
operate(&obj1);
operate(&obj2);
}
질문은 operate()
에있는 주어진 객체의 실제 유형이 dynamic_cast
및 클래스 (상수 등)에있는 유형 정보를 사용하지 않고 어떻게되는지를 아는가? operate()
함수는 작은 시간 간격으로 많은 수의 객체와 함께 사용되며 dynamic_cast
은 너무 느리고 상수 (enum obj_type { ... }
)를 포함하고 싶지 않습니다. 이는 OOP 방식이 아니기 때문입니다.
// module operate.cpp
void some_operate(Base *pBase)
{
processA(pBase);
processB(pBase);
}
void processA(A *pA)
{
}
void processB(B *pB)
{
}
이 함수에 직접 pBase
을 전달할 수 없습니다. 그리고 가능한 모든 클래스 조합을 가질 수는 없습니다. 왜냐하면 새로운 헤더 파일을 포함 시켜서 새로운 클래스를 추가 할 수 있기 때문입니다. 마음에 온
하나의 솔루션으로, 편집기에서 나는 복합 용기 사용할 수 있습니다
struct CompositeObject
{
vector<Base *pBase> parts;
};
을하지만 편집기는 시간 최적화를 필요로하지 않는다 및 부품이 정확한 유형을 결정하는 dynamic_cast
를 사용할 수 있습니다. operate()
에서이 솔루션을 사용할 수 없습니다.
따라서이 문제를 해결하기 위해 dynamic_cast
을 입력하고 정보를 입력하지 않아도됩니까? 아니면 다른 아키텍처를 사용해야합니까?
왜 실제 유형을 알아야합니까? 가상 기능을 사용할 수없는 이유는 무엇입니까? –
상수를 사용하여 가능한 모든 방법 dynamic_cast, RTTI를 제한했습니다. 또는 "string typeName"을 저장하면 Neil이 대답 한 옵션 중 하나 인 "another architecture"가 남았습니다. – dicaprio
> 가상 기능을 사용할 수없는 이유는 무엇입니까? 이 mixin 클래스에 대한 공통 인터페이스가 없기 때문입니다. – KneLL