Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从字符串实例化类,从文件读取_C++ - Fatal编程技术网

C++ C++;从字符串实例化类,从文件读取

C++ C++;从字符串实例化类,从文件读取,c++,C++,编辑:问题是我试图在我的cpp文件的全局范围内调用静态函数,但由于某些原因,该函数无法工作: //Player.cpp RTTI::instance()->registerClass(...) // ERROR Player::Player() {} Player::~Player() {} 为了解决这个问题,我修改了代码如下: template <class T> struct RTTIRegister { RTTIRegister<T>(cons

编辑:问题是我试图在我的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);
我为什么会收到此错误,我可以做些什么来修复它?

代码:

现在,当我的程序读取该文件时,它应该创建一个类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);

注册一个类后,我应该能够通过说RTTI::createGameObject(“Player”)来创建实例

您尚未在类RTTI中定义static instance()成员函数。但您正在宏中访问它:

#define PROTOTYPE_REGISTER(NAME, CLASS) \
RTTI::instance()->registerClass(NAME, &CLASS::createInstance);
PROTOTYPE\u寄存器
也需要2个参数

定义原型并创建(基、类)\ 在player类中,替换对PROTOTYPE_CREATE的调用 具有
PROTOTYPE_CREATE(游戏对象、玩家)

您的一个障碍是创建函数的返回类型。大多数工厂模式返回一个指向基类对象的指针,换句话说,是一个返回类型

工厂可以像一堆switch语句一样简单,以便使用查找表

查找表将由一列中的键或字符串以及第二列中指向创建函数的指针组成。在键列中搜索匹配的字符串,然后使用函数指针(在同一行中)创建该实例。同样的障碍:创建函数必须在表中具有相同的签名(相同的返回类型)。

尝试以下操作:与代码的差异非常小:
结构游戏对象{
};
typedef游戏对象*(*createFunc)(无效);
类RTTI
{
公众:
静态RTTI*实例();
void registerClass(const std::string和className,createFunc实例化);
GameObject*createGameObject(const std::string和className);
私人:
静态RTTI*s_实例;
标准::地图s_注册激光;
};
RTTI*RTTI::s_instance=nullptr;
RTTI*RTTI::instance()
{
如果(!s_实例)
{
s_实例=新的RTTI();
}
返回s_实例;
}
void RTTI::registerClass(const std::string&className,createFunc实例化)
{
insert(std::make_pair(className,实例化));
}
GameObject*RTTI::createGameObject(常量std::字符串和类名)
{
返回空ptr;
}
**#定义原型并创建(基、类)\
静态基*createInstance(){返回新类();}**
#定义原型_寄存器(名称、类)\
RTTI::instance()->registerClass(名称、类::createInstance);
//Player.h
类玩家:公共游戏对象
{
公众:
//静态游戏对象*createInstance(){返回新玩家();}
原型创建(游戏对象、玩家);
};
//Player.cpp
int _tmain(int argc,_TCHAR*argv[]
{
原型_寄存器(“播放器”,播放器)
返回0;
}

在internet上搜索“factory design pattern c++”。您可能想学习一些键盘输入/键入类,这样就可以摆脱邪恶的宏。我不喜欢clone()方法策略,因为在读取文件之前不会创建任何实例。我也不知道会有多少个类。我很抱歉,我缩短了代码,忘了添加那些。现在,上面的代码是正确的,但我仍然得到了错误。如果您将PROTOTYPE_CREATE更改为#define PROTOTYPE_CREATE(BASE,CLASS)\static BASE*createInstance(){return new CLASS();},它应该可以工作查找表正是我想要的。有没有办法在cpp文件中调用PROTOTYPE_REGISTER,其中实现了Player类,即:
//Player.cpp PROTOTYPE_REGISTER(“Player”,Player)Player::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() {}
#define PROTOTYPE_REGISTER(NAME, CLASS) \
RTTI::instance()->registerClass(NAME, &CLASS::createInstance);
static BASE* createInstance() { return new CLASS(); }
try this: Very small difference from your code:

struct GameObject {

};
typedef GameObject* (*createFunc)(void);
class RTTI
{

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;
};

RTTI* RTTI::s_instance = nullptr;

RTTI* RTTI::instance()
{
    if (!s_instance)
    {
        s_instance = new RTTI();
    }
    return s_instance;
}
void RTTI::registerClass(const std::string& className, createFunc instantiate)
{
    s_registeredClases.insert(std::make_pair (className, instantiate));
}
GameObject* RTTI::createGameObject(const std::string& className)
{
    return nullptr;
}

**#define PROTOTYPE_CREATE(BASE, CLASS) \
    static BASE* createInstance() { return new CLASS(); }**

#define PROTOTYPE_REGISTER(NAME, CLASS) \
    RTTI::instance()->registerClass(NAME, CLASS::createInstance);


//Player.h
class Player : public GameObject
{
public:
    //static GameObject* createInstance() { return new Player(); }
    PROTOTYPE_CREATE(GameObject, Player);
};
//Player.cpp

int _tmain(int argc, _TCHAR* argv[])
{
    PROTOTYPE_REGISTER("Player", Player)
    return 0;
}