0

私のプログラムは次の行にバグがあります:

RAT_Entity* ecm = new RAT_EntityCustomModel();
ecm->Init(entities.size(), resourceManager->getCustomMesh(meshURL));

子エンティティを初期化する必要がありますが、代わりにエンジンが壊れます。

RAT_EntityおよびRAT_EntityCustomModelのヘッダーは次のとおりです。

#ifndef RAT_ENTITY_H
#define RAT_ENTITY_H

#include <iostream>

namespace RAT_ENGINE
{
    class RAT_Entity
    {
    public:
        RAT_Entity();
        ~RAT_Entity();

        virtual void Init(int argID, void* argVoid);
        virtual void CleanUp();

        int getID() const;

        virtual void PrintIO() const;
    protected:
        int id;
    };
}

#endif

#ifndef RAT_ENTITYCUSTOMMODEL_H
#define RAT_ENTITYCUSTOMMODEL_H

#include "RAT_Entity.h"
#include "RAT_CustomMesh.h"

namespace RAT_ENGINE
{
    class RAT_EntityCustomModel : public RAT_Entity
    {
    public:
        RAT_EntityCustomModel();
        ~RAT_EntityCustomModel();

        void Init(int argID, RAT_CustomMesh* argMesh);
        void CleanUp();

        RAT_CustomMesh* getMesh() const;

        void PrintIO() const;
    private:
        RAT_CustomMesh* mesh;
    };
}

#endif

ご覧のとおり、void RAT_EntityCustomModel::Init(int argID, RAT_CustomMesh* argMesh)この関数はから継承していますvirtual void RAT_Entity::Init(int argID, void* argVoid)。これを行う必要があったのは、そうしないと次のエラーが発生するためです。

1> e:\ rat_engine \ rat_engine \ rat_engine \ rat_entitymanager.cpp(34):エラーC2660:'RAT_ENGINE :: RAT_Entity :: Init':関数は2つの引数を取りません

しかし、子の関数を呼び出すと、エンジンが壊れます。どうすればこれを修正できますか?

4

2 に答える 2

4

バグは、

RAT_Entity::Init

RAT_EntityCustomModel::Init

異なる署名があります。結果として、後者の関数は最初の関数をオーバーライドしません。void*ポインタを渡すと、RAT_Entity::Initが呼び出されます。しかし、あなたはそれRAT_EntityCustomModel::Initが呼ばれることを期待しています。

この種のバグを修正するには、C ++ 11で導入されたoverrideキーワードを使用することを強くお勧めします。つまり、署名をに変更しますRAT_EntityCustomModel::Init

void Init(int argID, RAT_CustomMesh* argMesh) override;

その場合、コンパイラはこの種のエラーについて文句を言います。ただし、C++11準拠のコンパイラが必要です。

于 2013-03-08T08:11:30.003 に答える
1

あなたはより深い問題を抱えています。

正しく初期化するためには、おそらく完全に異なるものが必要ですが、私にはわかりませRAT_Entityん。RAT_EntityCustomModel

それらの間の共通点は、たとえば、何かが必要なことです。違いは、RAT_CustomMeshたとえば、異なるものが必要なことです。

必要なものが完全に異なるわけではない場合、つまり両方に何らかのメッシュが必要な場合は、RAT_Meshの代わりに基本クラスのパラメーターとして渡すことができますvoid*

それらが完全に異なるもので初期化されている場合は、Entity必要なものを決定する必要があります。その場合、リソースマネージャーを渡します。これは、既に持っているものから少し変更されたもので、エンティティはそこから必要なものを要求できます。

class ResourceManager {
public:
    RAT_PlainMesh* getPlainMesh();
    RAT_CustomMesh* getCustomMesh();
};

そして、基本のRAT_Entityinit関数:

class RAT_Entity
{
public:
    virtual void Init(int argID, ResourceManager& resourceManager);
    //...
};
于 2013-03-08T08:54:12.290 に答える