0

次のコードに問題があります。オーバーライドされた仮想関数が実行されていません。ここで間違っているかどうかはわかりませんが、おそらくばかげた間違いです。とにかく、これはゲーム プロジェクトであり、私はこのようなオブジェクトの配列を持っています (core::array はベクトル配列に似た irrlicht 配列です)

core::array<GameObject> gameTargets;

これはGameObjectとのZombie 定義です

class GameObject {
protected:
    scene::ISceneNode* node;
public:
    int ID;
    int hitpoints;

    GameObject() {
        ...
    };

    void setNode(scene::ISceneNode* inode) {
        ...
    }

    virtual void shot(int dmg) {
        ... [BREAKPOINT HERE]
    }

    scene::ISceneNode* getNode() {
        return node;
    }
};

class Zombie : public GameObject {
public:
    static const enum Animation {
        ZOMBIE_WALK,
        ZOMBIE_HURT,
        ZOMBIE_DIE,
        ZOMBIE_TWITCH,
        ZOMBIE_ATTACK,
        ZOMBIE_IDLE
    };

    //We only want to accepted animated mesh nodes for this object
    Zombie(int hp, scene::IAnimatedMeshSceneNode* inode) {
        ...
    }

    //Override the shot function
    void shot(int dmg) {
        ... [BREAKPOINT HERE]
    }

    //Animate the zombie
    void setAnimation(Animation anim) {
        ...
    }
};

派生クラスのメンバー関数が呼び出されることはありません。このようなオブジェクトを作成しています

Zombie target(hp, (scene::IAnimatedMeshSceneNode*)node);

そして、このように仮想関数を呼び出します

for(int i = 0; (u32)i<level->gameTargets.size(); i++) {
    if(selectedNode == level->gameTargets[i].getNode()) {
        level->gameTargets[i].shot(b->damage);
    }
}

ここで、b は int 変数のダメージを持つ弾丸へのポインターであり、gameTargets には GameObject が含まれます

4

3 に答える 3

7

gameTargets配列に値が含まれているため、スライスが発生していると思われます。core::arrayテンプレートの仕組みがわからないのでなんとも言えません。オブジェクトのスライスとはを参照してください。スライスとは何かについての議論のために。

この問題を解決するには、生のポインターを次のように保存します。

core::array<GameObject *> gameTargets;

または、ある種の参照カウントポインターを使用します

core::array<std::shared_ptr<GameObject>> gameTargets; // only available in C++11
于 2012-04-19T14:11:35.027 に答える
1

array<GameObject>ポインターのコンテナーではなく、オブジェクトのコンテナーです。それに追加するすべてのオブジェクトはゲームオブジェクトであり、派生クラスの 1 つではありません (派生クラス オブジェクトを追加すると、「スライス」されます)。

あなたが何をしているのか正確にわからなくてcore::arrayも、あなたが本当に作成しようとしていたのは、次std::unique_ptr<GameObject>の行に沿った(スマートポインター)の配列であると思われます

core::array< std::unique_ptr<GameObject> > gameTargets;
std::unique_ptr<GameObject> my_zombie(new Zombie);
gameTargets.push_back( my_zombie );
于 2012-04-19T14:15:33.107 に答える
0

簡単な解決策は、次のように、これらの親関数を純粋な仮想関数として作成することです。

virtual void shot(int dmg) { } = 0; 

// Frerich Raabe の提案に従って、ポインターの配列を編集して使用する

于 2012-04-19T14:14:54.213 に答える