c++實現反射機制


c#中反射機制比較常見,而c++中沒有該機制。使用c++實現反射機制,主要利用了工廠模式進程對象的生產。

ITest.h 基類
Test.h 繼承類
helper.h 幫助類
main.cpp 主函數入口文件

 

//ITest.h

#pragma once
#include <map>
using namespace std;

class ITestFactory;
typedef map<string, ITestFactory*> MapFactory;
static MapFactory g_mapFactory;

class ITest
{
public:
	virtual ~ITest() {};
	virtual void TestPrint() = 0;

private:

};


class ITestFactory
{
public:
	void registerFactory(string clsName, ITestFactory* pFactory)
	{
		g_mapFactory.insert(make_pair(clsName, pFactory));
	}
	virtual ITest* intance() = 0;

};

 

//Test.h

#pragma once
#include "ITest.h"


class Test: public ITest
{
public:
     ~Test() {};
	 void TestPrint()
	 {
		 printf("im Test\n");
	 }

private:

};


class TestFactory :public ITestFactory
{
public:
	TestFactory()
	{
		registerFactory("Test", this);
	}
	~TestFactory() {};

private:
	ITest* intance()
	{
		static  ITest *m_pTest=NULL;

		if (NULL == m_pTest)
		{
			m_pTest = (ITest*)new Test;
		}
		return m_pTest;
	}

};


//Helper.h

#pragma once
#include "ITest.h"

ITest* GetClassByName(string clsName)
{
	ITestFactory *pFacory;
	map<string, ITestFactory*>::iterator iter;
	iter = g_mapFactory.find(clsName);
	if (iter!= g_mapFactory.end())
	{
		pFacory = iter->second;
	}
	else
	{
		return NULL;
	}
	
	return pFacory->intance();
}

//main.cpp

#include "pch.h"
#include <iostream>
#include "Helper.h"
#include "Test.h"

int main()
{
	static TestFactory m_testFactory; //通過構造註冊工廠
    std::cout << "Hello World!\n"; 
	
	ITest *p = GetClassByName("Test");
	p->TestPrint();
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章