我的程序在以下行中出错:
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&gt; e:\ rat_engine \ rat_engine \ rat_engine \ rat_entitymanager.cpp(34):错误 C2660:'RAT_ENGINE :: RAT_Entity :: Init':函数不带2 参数
但现在我的引擎在调用孩子的功能时会中断。我该如何解决这个问题?
答案 0 :(得分: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的编译器。
答案 1 :(得分:1)
你有更深层次的问题。
您的RAT_Entity
和RAT_EntityCustomModel
需要不同的东西才能正确初始化,可能是完全不同的东西,我无法分辨。
他们之间的共同点是他们需要一些东西,区别在于他们需要不同的东西,例如RAT_CustomMesh
。
如果他们需要的东西没有完全不同,即他们都需要某种网格,那么你可以将RAT_Mesh
作为参数传递给基类,而不是void*
。
如果用完全不同的东西初始化它们,那么Entity
需要决定它需要什么。在这种情况下,传递一个资源管理器,从您已经修改过的资源管理器,可以从中请求实体所需的资源管理器。
class ResourceManager {
public:
RAT_PlainMesh* getPlainMesh();
RAT_CustomMesh* getCustomMesh();
};
基础RAT_Entity
init函数:
class RAT_Entity
{
public:
virtual void Init(int argID, ResourceManager& resourceManager);
//...
};