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_Entity初始化函数:

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