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()
関数は、短期間にオブジェクトの大きな配列で使用され、遅すぎます。これは OOP の方法ではないためdynamic_cast
、定数 ( ) を含めたくありません。enum obj_type { ... }
// module operate.cpp
void some_operate(Base *pBase)
{
processA(pBase);
processB(pBase);
}
void processA(A *pA)
{
}
void processB(B *pB)
{
}
pBase
これらの関数にa を直接渡すことはできません。また、新しいヘッダー ファイルをインクルードするだけで新しいクラスを追加できるため、考えられるすべてのクラスの組み合わせを持つことは不可能です。
思いついた解決策の 1 つは、エディターで複合コンテナーを使用できることです。
struct CompositeObject
{
vector<Base *pBase> parts;
};
ただし、エディターは時間の最適化を必要とせずdynamic_cast
、パーツを使用して正確なタイプを決定できます。このoperate()
ソリューションを使用できません。
dynamic_cast
では、この問題を解決するために a と型の情報を使用しないようにすることは可能でしょうか? それとも、別のアーキテクチャを使用する必要がありますか?