0

名前は異なるがまったく同じ構造の 2 つのクラスがあるとします。あるクラスのオブジェクトを別のクラスにキャストする方法はありますか?

これはばかげているように聞こえるかもしれませんが、私がそれをやりたいのには理由があります。私のアプリケーションのアーキテクチャは抽象クラスcomponentを提供し、storage準備が整ったアプリケーションには から派生したいくつかの特殊なコンポーネントが含まれcomponent、それぞれが から派生した独自のストレージ タイプを定義しますstorage。アプリケーションの初期化中に、コンポーネントごとにカスタム ストレージ タイプのストレージ オブジェクトが作成され、コンポーネントへのポインタとして渡されます。

このようにして、すべてのコンポーネントが完全に独立したままになるため、再利用とテストに最適です。しかし、もちろん、コンポーネント間で情報を交換する必要があります。独立性を念頭に置いてこれを行うには、2 つのコンポーネントが同じストレージを指すストレージ ポインターを取得できるようにします。制約によるポインタは、コンポーネント固有のストレージ タイプである必要があります。

フレームワーク コード (抽象クラス)

class Storage {};

class Component {
public:
    void SetStorage(Storage* storage);
private:
    Storage* storage;
};

コンポーネントの例

class PhysicsStorage : public Storage;
class PhysicsComponent : public Component;

別のコンポーネント

class CollisionStorage : public Storage; // same structure as PhysicsStorage as both components need the same data like world coordinates and rotations of all forms in the 3d space
class CollisionComponent : public Component;

主な用途

#include "system.h"

PhysicsStorage Worlddata;

PhysicsComponent Physics;
CollisionComponent Collision;

Physics.SetStorage(&Worlddata);
Collision.SetStorage(&Worlddata); // this points to a PhysicsStorage but that is actually the same like a CollisionStorage which is expected

PhysicsStorage*では、 say toのポインタをキャストする方法はあるのだろうかCollisionStorage*。この場合、両方とも関連するコンポーネント クラスのファイルで定義されます。そして、どちらも abstract から派生していStorageます。

両方のカスタム ストレージ タイプの構造がまったく同じである場合にのみ、これを実行したいと考えています。そうでなければ、それは無意味です。私は高度なポインターの使用法にあまり慣れていないので、それを行う方法があるかどうか疑問に思っています。私が知っているのは、基本クラスにキャストできるということですが、これは私がここで望んでいることではありません。2 つのコンポーネントに共有ストレージ タイプを使用すると、独立性が失われます。どうもありがとう!

4

1 に答える 1

2

これは機能する場合と機能しない場合があります。これは未定義の動作の場合であると私は信じており、本番コードでこれを行うことは避けたいと思います。

代わりに、共通のフィールドとメソッドを新しいクラスにプッシュし、そのクラスを持っComponentOneStorageComponentTwoStorage継承することを検討してください。次に、代わりに基本クラスにポインター/参照を渡すことができます。これにより、互換性のないポインター型間でキャストしなくても、共通データにアクセスできます。

于 2012-10-25T17:39:05.870 に答える