C++ 中有一个有趣的问题,但更多的是关于架构。
有许多(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)
{
}
我不能直接将 a 传递pBase
给这些函数。而且不可能有所有可能的类组合,因为我可以通过包含新的头文件来添加新的类。
想到的一种解决方案是,在编辑器中我可以使用复合容器:
struct CompositeObject
{
vector<Base *pBase> parts;
};
但是编辑器不需要时间优化,可以dynamic_cast
根据零件来确定准确的类型。在operate()
我不能使用这个解决方案。
那么,是否可以避免使用adynamic_cast
和type信息来解决这个问题呢?或者也许我应该使用另一种架构?