【发布时间】:2015-12-21 04:38:20
【问题描述】:
编辑:问题是我试图在我的 cpp 文件的全局范围内调用一个静态函数,但由于某种原因它不起作用:
//Player.cpp
RTTI::instance()->registerClass(...) // ERROR
Player::Player() {}
Player::~Player() {}
为了解决这个问题,我将代码更改如下:
template <class T>
struct RTTIRegister {
RTTIRegister<T>(const std::string& name) {
RTTI::instance()->registerClass(name, &T::createInstance);
}
};
#define PROTOTYPE_CREATE(CLASS, BASE) \
static BASE* createInstance() { return new CLASS(); }
#define PROTOTYPE_REGISTER(NAME, CLASS) \
RTTIRegister<CLASS> __rtti__(NAME);
我正在尝试编写一个类/宏,这将使我能够创建类的实例,我将其名称存储在字符串中,从文件中读取。我有很多 GameObject 类的派生类。当我使用下面的代码时,它在 Visual Studio C++ 2012 Express 中出现错误:
Error 2 IntelliSense: a trailing return type requires the 'auto' type specifier Player.cpp
Error 1 error C2061: syntax error : identifier 'registerClass' player.cpp
为什么我会收到此错误,我该如何解决?
代码:
// JSON
{
"GameObjects" : [
{
"Class" : "Player",
"Health" : 15
}
]
}
现在,当我的程序读取文件时,它应该创建一个 Player 类的实例。我目前拥有的是以下内容:
class RTTI
{
typedef GameObject* (*createFunc)(void);
public:
static RTTI* instance();
void registerClass(const std::string& className, createFunc instantiate);
GameObject* createGameObject(const std::string& className);
private:
static RTTI* s_instance;
std::map<std::string, createFunc> s_registeredClases;
};
#define PROTOTYPE_CREATE(CLASS) \
static CLASS* createInstance() { return new CLASS(); }
#define PROTOTYPE_REGISTER(NAME, CLASS) \
RTTI::instance()->registerClass(NAME, &CLASS::createInstance);
现在我的播放器类定义为:
//Player.h
class Player : public GameObject
{
PROTOTYPE_CREATE(Player)
}
//Player.cpp
PROTOTYPE_REGISTER("Player", Player) /* **THIS IS WHERE IT GIVES ME AN ERROR */
Player::Player() {}
Player::~Player() {}
注册一个类后,我应该可以通过说 RTTI::createGameObject("Player"); 来创建实例
【问题讨论】:
-
在互联网上搜索“工厂设计模式 c++”。
-
你可能想参加一些键盘/打字课程,这样你就可以摆脱邪恶的宏。
-
我不喜欢 clone() 方法策略,因为我不会在读取文件之前创建任何实例。我也不知道会有多少课。
标签: c++