理了一下思路,实现动态识别和创建对象
今天又整理了一下思路,重新简要写了一下实现动态识别的机制
include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: 在此处引用程序需要的其他头文件
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <functional>
#include <iostream>
#include <unordered_map>
#include <codecvt>
using namespace std;
class CMyObject;
typedef CMyObject * (* FP)();
class B;
class C;
class D;
struct reg_map;
typedef reg_map DynamicManageClass;
struct reg_map
{
static std::unordered_map<std::wstring , FP> className_To_Construct;
reg_map( const std::wstring & classNameStr , const FP & pConstructFunc )
{
if (classNameStr.empty())
return;
reg_map::className_To_Construct[classNameStr] = pConstructFunc;
}
static CMyObject * ConstructInst(const wchar_t * nameStr)
{
if ( nameStr == nullptr )
return nullptr;
if ( reg_map::className_To_Construct.count( nameStr ) <= 0 )
{
wcout << L"\n" << nameStr << L" is not a class name! Construct Instance is failed!";
return nullptr;
}
FP pf = reg_map::className_To_Construct[nameStr];
if ( pf == nullptr )
{
wcout << L"\nclass " << nameStr << L" does not support dynamic creation (only dynamic identification)! Construct Instance is failed!" ;
return nullptr;
}
return (* pf)();
}
};
std::unordered_map<std::wstring , FP> reg_map::className_To_Construct;
template <typename Type>
class dy
{
public:
// typedef Type _classType;
static const reg_map _initMap;
};
template <typename Type>
class dyc
{
public:
// typedef Type _classType;
static CMyObject * ConstructInst(){ return new Type(); }
static const reg_map _initMap;
};
#define DECLARE_DYNAMIC()\
virtual bool isKindof(const wchar_t * nameStr);\
virtual std::wstring getClassName();\
virtual std::wstring getBaseClassName();\
virtual std::wstring getRootBasetClassName();
#define IMPLEMENT_DYNAMIC(class_name, baseclass_name)\
class class_name;\
template class dy<class_name>;\
const reg_map dy<class_name>::_initMap(L#class_name , nullptr);\
bool class_name::isKindof(const wchar_t * nameStr)\
{\
if ( nameStr == nullptr )\
return false;\
if ( std::wstring(L#class_name).compare( nameStr ) == 0 )\
{ \
wcout << L"\nobject is kind of " << L#class_name;\
return true;\
}\
else \
{\
return baseclass_name::isKindof( nameStr );\
}\
}\
std::wstring class_name::getClassName(){ return L#class_name; }\
std::wstring class_name::getBaseClassName(){ return baseclass_name::getClassName(); }\
std::wstring class_name::getRootBasetClassName(){ return baseclass_name::getRootBasetClassName(); }
#define IMPLEMENE_DYCREATE(class_name, baseclass_name)\
class class_name;\
template class dyc<class_name>;\
const reg_map dyc<class_name>::_initMap(L#class_name , dyc<class_name>::ConstructInst);\
bool class_name::isKindof(const wchar_t * nameStr)\
{\
if ( nameStr == nullptr )\
return false;\
if ( std::wstring(L#class_name).compare( nameStr ) == 0 )\
{ \
wcout << L"\nobject is kind of " << L#class_name;\
return true;\
}\
else \
{\
return baseclass_name::isKindof( nameStr );\
}\
}\
std::wstring class_name::getClassName(){ return L#class_name; }\
std::wstring class_name::getBaseClassName(){ return baseclass_name::getClassName(); }\
std::wstring class_name::getRootBasetClassName(){ return baseclass_name::getRootBasetClassName(); }
class CMyObject
{
public:
virtual ~CMyObject(){ ; }
public:
virtual bool isKindof(const wchar_t * nameStr)
{
if ( nameStr == nullptr )
{
return false;
}
if ( std::wstring(L"CMyObject").compare( nameStr ) == 0 )
{
wcout << L"\nobject is kind of CMyObject.";
return true;
}
wcout << L"\nobject is not kind of " << nameStr;
return false;
}
virtual std::wstring getClassName(){ return L"CMyObject"; }
//类里没有了static 的construct()函数,放到外部一个模板实例类里了。
//省字节,被模板实例占字节了,平衡
virtual std::wstring getBasetClassName(){ return L"\0"; }
virtual std::wstring getRootBasetClassName(){ return getClassName(); }
virtual void fun() = 0; //注意派生类内必须定义,才能动态创建对象实例
};
template class dy<CMyObject>;
const reg_map dy<CMyObject>::_initMap(L"CMyObject" , nullptr);
class B : public CMyObject
{
public:
virtual ~B(){ ; }
public:
DECLARE_DYNAMIC()
};
IMPLEMENT_DYNAMIC(B, CMyObject)//动态识别
class C : public B
{
public:
virtual ~C(){ ; }
public:
virtual void fun() { ; }
DECLARE_DYNAMIC()
};
IMPLEMENE_DYCREATE(C, B) //动态创建
class D : public C
{
public:
virtual ~D(){ ; }
public:
DECLARE_DYNAMIC()
};
IMPLEMENE_DYCREATE(D, C) //动态创建
int _tmain(int argc, _TCHAR* argv[])
{
CMyObject * pObj = DynamicManageClass::ConstructInst(L"CMyObject");
if ( pObj != nullptr )
{
pObj->isKindof( L"CMyObject" );
pObj->isKindof( L"B" );
pObj->isKindof( L"C" );
pObj->isKindof( L"D" );
delete pObj;
}
cout << "\n";
pObj = DynamicManageClass::ConstructInst(L"B");
if ( pObj != nullptr )
{
pObj->isKindof( L"CMyObject" );
pObj->isKindof( L"B" );
pObj->isKindof( L"C" );
pObj->isKindof( L"D" );
delete pObj;
}
cout << "\n";
pObj = DynamicManageClass::ConstructInst(L"C");
if ( pObj != nullptr )
{
pObj->isKindof( L"CMyObject" );
pObj->isKindof( L"B" );
pObj->isKindof( L"C" );
pObj->isKindof( L"D" );
delete pObj;
}
cout << "\n";
pObj = DynamicManageClass::ConstructInst(L"D");
if ( pObj != nullptr )
{
pObj->isKindof( L"CMyObject" );
pObj->isKindof( L"B" );
pObj->isKindof( L"C" );
pObj->isKindof( L"D" );
delete pObj;
}
cout << "\n";
return 0;
}
...全文
相关推荐
动态规划问题解题思路和总结
### 动态规划问题解题思路和总结#### 动态规划概述动态规划是一种用于求解具有重叠子问题和最优子结构特征的问题的强大工具。
车牌识别的思路研究
**动态调整**:对于难以识别的部分,可以动态调整算法参数,或采用混合模型,结合多种识别方法。总结来说,车牌识别和验证码识别的关键在于图像预处理、特征提取和分类。
JavaScript动态插入script的基本思路及实现函数
本文将详细介绍动态插入script标签的基本思路,并提供一个实现该功能的JavaScript函数。### 动态插入script的基本思路动态插入JavaScript代码通常包括以下几个步骤:1.
浅析动态人脸识别技术难点与解决思路.pdf
总之,动态人脸识别技术的发展需要克服一系列技术难题,通过技术创新和硬件升级,可以逐步提高其在实际应用中的性能和可靠性。
php验证码的制作思路和实现方法
本文详细介绍PHP验证码的制作思路和实现方法。一、验证码的制作思路1. 产生一张PNG格式的图片:通常情况下,验证码会被生成为一个图像文件,用于展示给用户识别。


