2

C ++では、一連の構造が定義されています...

struct Component {};
struct SceneGraphNode : Component {};
struct Renderable : Component {};
struct Health : Component {};

これらは簡単にクラスになる可能性があります。C++ にはほとんど違いがないと言われています。

Java では、型の配列を宣言し、Componentそこから拡張 (継承) する任意のクラスを配置できComponentます。Java はそれらをすべてコンポーネントと見なし、すべてがスマート ポインターを使用するため、Java の「配列」は実際にはすべて同じサイズのスマート ポインターのリストにすぎません。

ただし、Java は C++ とは大きく異なる配列を処理することを理解しています。これらの各構造体のサイズを確認すると、次のようになりました。

Component                   // 4
SceneGraphNode : Component  // 8
Renderable : Component      // 8
Health : Component          // 20

これは驚くべきことではありません。コンポーネントの配列を作成すると、ブロックのサイズは明らかに 4 (バイト) になり、他の構造は保持されません。

だから私の質問は、どのようにゆるいリストを保存できますかComponents(つまり、コンポーネントから継承する任意のクラス/構造体を保存できるリスト)?Java では、これを実行するのは非常に簡単です。確かにC++でそれを行う簡単な方法があるに違いありません。

4

3 に答える 3

2

子クラス オブジェクトへの Base クラス ポインタを持つことができます。つまり、 Component * sgn = new SceneGraphNode

そのため、s の配列Component*(サイズを変える必要がある場合はベクトル) を割り当て、各エントリ ポイントを派生オブジェクトにします。

Component * components[100];
components[0] = new SceneGraphNode;
components[1] = new Renderable;
// so on and so on

これに加えて、子クラスで定義するメンバー関数のコンポーネントに仮想関数が必要です。

class Component {
    public:
        virtual void method() = 0;
        virtual int method2(int arg) = 0;
};

class SceneGraphNode : public Component {
    public:
        virtual void method(){
            //body
        }
        virtual int method2(int arg){
            return arg*2;
        }
};

このvirtualキーワードにより、実行時にポインター型のメソッドを呼び出すのではなく、指定されたオブジェクトの実際の型を調べてそのメソッドを呼び出すようになります。これが Java の通常の動作です。は= 0関数を「純粋仮想」にします。つまり、子クラスがそのメソッドを定義する必要があります。上で定義した配列を使用して...

components[0]->method();
compenents[2]->method2(1);

配列よりもベクトルを使用する場合は、配列バージョンを次のように置き換えることができます。

#include <vector>;
//...
std::vector<Component* > components;
components.push_back(new SceneGraphNode);
components.push_back(new Renderable);
于 2013-04-18T03:26:00.440 に答える
1

次のように保存します

std::vector<Component *> components;
Component * c = new Health;
components.push_back( c );

呼び出し components[0] -> method();はの呼び出しmethod()ますHealth

これは、C++ でポリモーフィズムが行われる方法です。

またmethod()、コンポーネントがvirtual

于 2013-04-18T03:24:49.123 に答える
1

vector基本クラス オブジェクトを指す一連のスマート ポインターを格納し、そこに派生クラス オブジェクトを追加できます。

例えば:

 std::vector<std::unique_ptr<Component> > base;
 Component.push_back( std_unique_ptr<Component>(new SceneGraphNode()) ); 
            //^^use correct constructor, this example just show the methodology
 Component.push_back( std_unique_ptr<Component>(new Renderable()) );
于 2013-04-18T03:25:32.270 に答える