C++杂谈 简单工厂模式 装备 反射机制技能

  1. 反射机制的实现 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);
  1. 简单工厂模式 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);
	}
};
  1. 牛刀小试
#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
在这里插入图片描述

  1. 读配置文件实现
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值