- 反射机制的实现 Reflect.h
#pragma once
#include <string>
#include <map>
#include <iostream>
typedef void* (*register_func)();
class Object
{
private:
Object(){}
public:
static Object* GetInstance()
{
static Object object;
return &object;
}
void* GetInstanceByClassName(const std::string& class_name)
{
std::map<std::string, register_func>::iterator iter = m_register.find(class_name);
if (iter != m_register.end())
{
return iter->second();
}
else
{
std::cout << "The register is null!" << std::endl;
return nullptr;
}
}
void RegisterClass(const std::string& class_name, register_func func)
{
m_register[class_name] = func;
}
private:
std::map<std::string, register_func> m_register;
};
class Register
{
public:
Register(const std::string& class_name, register_func func)
{
Object::GetInstance()->RegisterClass(class_name, func);
}
};
#define REGISTER_DECLARE(class_name) \
class_name* ObjectCreator##class_name() \
{ \
return new class_name; \
} \
Register g_Register##class_name(#class_name, (register_func)ObjectCreator##class_name);
- 简单工厂模式 VirlualMoney.h
#pragma once
#include <iostream>
#include <string>
#include "Reflect.h"
class VirlualMoney
{
public:
VirlualMoney(){}
virtual ~VirlualMoney(){}
};
class BTC
:public VirlualMoney
{
public:
BTC(){ std::cout << "I am BTC!" << std::endl; }
~BTC(){}
};
class ETH
:public VirlualMoney
{
public:
ETH(){ std::cout << "I am ETH!" << std::endl; }
~ETH(){}
private:
};
class VirlualMoneyFactory
{
public:
VirlualMoney* CreateVirlualMoneyObject(const std::string& object)
{
return (VirlualMoney*)Object::GetInstance()->GetInstanceByClassName(object);
}
};
- 牛刀小试
#include <iostream>
#include "VirlualMoney.h"
REGISTER_DECLARE(BTC)
REGISTER_DECLARE(ETH)
int main(int argc, char* argv[])
{
VirlualMoneyFactory creatorDemo;
creatorDemo.CreateVirlualMoneyObject("BTC");
creatorDemo.CreateVirlualMoneyObject("ETH");
return 0;
}
Output
- 读配置文件实现
#include <iostream>
#include "VirlualMoney.h"
#include <fstream>
#include <string>
REGISTER_DECLARE(BTC)
REGISTER_DECLARE(ETH)
int main(int argc, char* argv[])
{
std::ifstream SysConfigFile("SystemConfig.txt", std::ios_base::in);
if (!SysConfigFile.is_open())
{
std::cout << "Open file failed!" << std::endl;
return -1;
}
std::string FileStorage;
SysConfigFile >> FileStorage;
std::cout << FileStorage << std::endl;
SysConfigFile.close();
VirlualMoneyFactory creatorDemo;
creatorDemo.CreateVirlualMoneyObject(FileStorage);
return 0;
}
备注:配置文件可以动态的改成“BTC”或者“ETH”,且注意配置文件需要放置项目文件夹的根目录下,否则会出现打开文件失败的问题。可以参考我的知乎文章(https://zhuanlan.zhihu.com/p/49446926)。
参考博客链接
https://blog.youkuaiyun.com/wcl199274/article/details/44067535
https://blog.youkuaiyun.com/RayMa0305/article/details/83476022
https://blog.youkuaiyun.com/RayMa0305/article/details/83476022