MFC关键技术-动态创建

//a.h头文件
#pragma once
#include"m.h"
#include<iostream>
using namespace std;class CShape;//类声明//RTTI结构体
struct CRuntimeClassTest
{LPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema;CShape*(PASCAL*m_pfnCreateShape)();//PASCAL宏为 __stdcall,一种回调机制CRuntimeClassTest* m_pBaseClass;static CRuntimeClassTest*  pFirstClass;CRuntimeClassTest* m_pNextClass;CShape* CreateObject();static CRuntimeClassTest* PASCAL Load();
};//中间结构定义
struct CLASS_INIT_TEST
{CLASS_INIT_TEST(CRuntimeClassTest* pNewClass);//c++struct也有构造函数
};//CShape基类定义
class CShape
{
public:virtual CRuntimeClassTest* GetRuntimeClassTest() const;BOOL IsKindOf(const CRuntimeClassTest* pClass) const;virtual void InputMsg() { cout << "CShape Successfully Created!" << endl; }
public:static CRuntimeClassTest classCShape;
};
//a.cpp函数实现文件
#include "a.h"
#include"m.h"
#include<iostream>
using namespace std;//全局变量
static char szCShape[] = "CShape";
struct CRuntimeClassTest CShape::classCShape = { szCShape ,sizeof(szCShape),0xffff,NULL,NULL };
static CLASS_INIT_TEST init_CShape(&CShape::classCShape);//CLASS_INIT_TEST结构体成员函数实现
CLASS_INIT_TEST::CLASS_INIT_TEST(CRuntimeClassTest * pNewClass)
{pNewClass->m_pNextClass = CRuntimeClassTest::pFirstClass;CRuntimeClassTest::pFirstClass = pNewClass;
}//Shape成员函数实现
CRuntimeClassTest* CShape::GetRuntimeClassTest() const
{return &CShape::classCShape;
}BOOL CShape::IsKindOf(const CRuntimeClassTest * pClass) const
{CRuntimeClassTest* pClassThis = GetRuntimeClassTest();while (pClassThis != NULL){if (pClassThis == pClass)return TRUE;pClassThis = pClassThis->m_pBaseClass;}return FALSE;
}//CRuntimeClassTest结构的函数实现
CShape * CRuntimeClassTest::CreateObject()
{if (m_pfnCreateShape == NULL){cout << "Error:Trying to creat object which is not DYNAMIC_CREATE_OBJECT:" << m_lpszClassName << endl;;return NULL;}CShape* pS = NULL;pS = (*m_pfnCreateShape)();return pS;
}
CRuntimeClassTest * CRuntimeClassTest::Load()
{char szClassName[64];CRuntimeClassTest* pClass;cout << "Input a class name:";cin >> szClassName;for (pClass = pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass){if (strcmp(szClassName, pClass->m_lpszClassName) == 0)//strcmp比较两字符串是否相等return pClass;}cout << "class not found:" << szClassName << endl;return NULL;
}
//m.h宏定义文件
#pragma once
#include<afxwin.h>
#include"a.h"/*
下面为几组宏,由于文字代换
*宏定义,"\"指换行,后面的语句和它是一个部分的。
*其中##告诉编译器把左右连个字符串连接在一起,即把class和参数class_name的值连接在一起。
*/
#define TyPeName(class_name)\public:\static CRuntimeClassTest class##class_name;\virtual CRuntimeClassTest* GetRuntimeClassTest() const;#define RUN_TIME_CLASS(class_name)\(&class_name::class##class_name)#define DYNAMIC_RUNTIMECLASS(class_name,baseclass_name,wSchema,pfnNew)\static  char lpsz##class_name[]=#class_name;\CRuntimeClassTest class_name::class##class_name={\lpsz##class_name,sizeof(class_name),wSchema,pfnNew,RUN_TIME_CLASS(baseclass_name),NULL};\static CLASS_INIT_TEST init_##class_name(&class_name::class_name::class##class_name);\CRuntimeClassTest* class_name::GetRuntimeClassTest() const\{return &class_name::class##class_name;}/*
*用于动态创建对象的宏
*/
#define DYNAMIC_CREATE(class_name,baseclass_name)\DYNAMIC_RUNTIMECLASS(class_name,baseclass_name,0xFFFF,NULL)//关键技术三,动态创建对象需要定义的宏
#define DYNAMIC_CREATE_OBJECT(class_name)\TyPeName(class_name)\static CShape*PASCAL CreateObject();#define IMP_DYN_CREATE(class_name,baseclass_name)\CShape*PASCAL class_name::CreateObject(){return new class_name;}\DYNAMIC_RUNTIMECLASS(class_name,baseclass_name,0xffff,class_name::CreateObject)
//main.cpp测试类编写与测试
#pragma once
#include"a.h"
#include"m.h"
#include<iostream>
using namespace std;CRuntimeClassTest* CRuntimeClassTest::pFirstClass = NULL;//静态成员变量初始化的位置class CEllipse :public CShape
{//TyPeName(CEllipse)DYNAMIC_CREATE_OBJECT(CEllipse)public:CEllipse() { cout << "CEllipse Successfully Constructor!" << endl; }void InputMsg() { cout << "CEllipse Successfully Created!" << endl; }
};
class CCircle :public CEllipse
{	//TyPeName(CCircle)DYNAMIC_CREATE_OBJECT(CCircle)
public:CCircle() { cout << "CCircle Successfully Constructor!"<< endl; }void InputMsg() { cout << "CCircle Successfully Created!" << endl; }
};//DYNAMIC_CREATE(CEllipse,CShape)
//DYNAMIC_CREATE(CCircle, CEllipse)IMP_DYN_CREATE(CEllipse, CShape)
IMP_DYN_CREATE(CCircle, CEllipse)
void Print()
{CRuntimeClassTest* pClass;for (pClass = CRuntimeClassTest::pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass){cout << pClass->m_lpszClassName << "," << pClass->m_nObjectSize << "," << pClass->m_wSchema << endl;}
}
int main()
{CEllipse* pE = new CEllipse;CCircle* pC = new CCircle;Print();if (pE->IsKindOf(RUN_TIME_CLASS(CEllipse))){cout << "对象pE的类型为:CEllipse." << endl;}else{cout << "对象pE的类型不是CEllipse." << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CEllipse))){cout << "对象pC的类型为CEllipse." << endl;}else{cout << "对象pC的类型不是CEllipse." << endl;}if (pE->IsKindOf(RUN_TIME_CLASS(CCircle))){cout << "对象pE的类型为:CCircle." << endl;}else{cout << "对象pE的类型不是CCircle." << endl;}if (pC->IsKindOf(RUN_TIME_CLASS(CCircle))){cout << "对象pC的类型为CCircle." << endl;}else{cout << "对象pC的类型不是CCircle." << endl;}delete pE;delete pC;//测试动态创建类对象CRuntimeClassTest* pClassCreate;CShape* pShape;while (true){if ((pClassCreate = CRuntimeClassTest::Load())== NULL)break;pShape = pClassCreate->CreateObject();if (pShape != NULL)pShape->InputMsg();}	return 0;
}

运行结果如下,从运行结果可知,动态创建类对象成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌利用人工智能设计的芯片揭示了智能的本质

来源&#xff1a;TechTalks 网站作者&#xff1a;Ben Dickson译者&#xff1a;Sambodhi策划&#xff1a;刘燕InfoQ 中文站曾经翻译并分享过《谷歌的深度学习在 AI 芯片中找到了一条关键路径》&#xff0c;该文介绍了 ZDNet 与谷歌大脑总监 Jeff Dean 谈到谷歌如何使用人工智能来…

MFC关键技术-永久保存机制

//Main.h文件 #pragma once #include<afxwin.h>class CEllipse :public CObject {DECLARE_SERIAL(CEllipse)private:double m_point; public:CEllipse(){}void Serialize(CArchive&); };//Main.cpp文件 #include"main.h"IMPLEMENT_SERIAL(CEllipse, CObjec…

2021世界人工智能大会最高奖项——卓越人工智能引领者奖(Super AI Leader,简称SAIL奖)在大会开幕式揭晓...

来源&#xff1a;AIII研究院备受全球人工智能界关注的2021世界人工智能大会最高奖项——卓越人工智能引领者奖&#xff08;Super AI Leader&#xff0c;简称SAIL奖&#xff09;今天在大会开幕式揭晓。获得2021 SAIL奖的是——利物浦大学机器人科学家、中科院上海微系统所免开颅…

2021年,深度学习还有哪些未饱和、有潜力且处于上升期的研究方向?

来自&#xff1a;知乎 作者&#xff1a;谢凌曦、数据误码率、Zhifeng编辑&#xff1a;极市平台 在目前的深度学习领域&#xff0c;有些研究方向已经较为成熟&#xff0c;实现新突破的难度与过去相比显著提升。那么就目前来看&#xff0c;还有哪些方向处于朝阳阶段&#xff0c;相…

浙江发布数字化改革标准化体系建设方案,将于2025年底建成

来源&#xff1a;中新网近日&#xff0c;记者从浙江省市场监管局获悉&#xff0c;《浙江省数字化改革标准化体系建设方案(2021-2025年)》(以下简称《方案》)已正式印发&#xff0c;该《方案》为浙江省数字化改革标准化体系建设工作明确了总体框架、分阶段目标、重点任务和相关保…

MFC基于对话框的商场交易软件实现

void CHomeViewDlg::OnClickedBtGuke() {// TODO: 在此添加控件通知处理程序代码CUserLoginDlg dlg;//注册窗框口类对象User user;user.m_UserType _T("顾客");dlg.SetUser(user);dlg.DoModal();//进入注册窗口窗口 }void CHomeViewDlg::OnClickedBtShangjia() {// …

GPU的发展历程、未来趋势及研制实践

来源&#xff1a;文章转载自期刊《微纳电子与智能制造》&#xff0c;作者&#xff1a;熊庭刚摘要凭借GPU强大的计算能力&#xff0c;超级计算机在数据处理、物理模拟、天气预测、现代制药、基因测序、先进制造、人工智能、密码分析等方面都有着广泛的应用。在2020年的新冠肺炎疫…

Mysql Explain的简单使用

Mysql Explain 主要重要的字段有上面红色方框圈出来的那几个。 type: 连接类型&#xff0c;一个好的SQL语句至少要达到range级别&#xff0c;杜绝出现all级别。key: 使用到的索引名&#xff0c;如果没有选择索引&#xff0c;值是NULL。可以采取强制索引方式。key_len: 索引长度…

Java-绘图相关技术

//学了太多的基础&#xff0c;感觉一直没太大的进步&#xff0c;因此&#xff0c;我决定增加以下学习的难度&#xff0c;以此来增加自己的学习兴趣&#xff1b; /*** Java 绘图相关技术的学习*Graphics类相关技术知识&#xff1a;* 1.Graphics类是所有图像绘图的基类&#xf…

20210712未来智能实验室收录资料

整理&#xff1a;未来智能实验室20210712未来智能实验室收录资料特别推荐&#xff1a;置顶收录未来智能实验室在人民日报《学术前沿》发表的城市大脑最新综述研究论文和报告《城市大脑的起源、发展与未来趋势》&#xff0c;从城市大脑的起源和理论基础&#xff1b;城市大脑的定…

RISC-V生态未来的三种可能~

来源&#xff1a;嵌入式资讯精选因为x86 架构与 Arm 架构商业使用都要付费&#xff0c;因此&#xff0c;RISC-V开源具有很大优势。今天就来说说 RISC-V 生态的内容。关于RISC-VRISC&#xff1a;Reduced Instruction Set Computer&#xff0c;即精简指令集计算机。RISC-V是基于R…

java-图像的几何变换

/** Java 绘图相关技术的学习*Graphics类相关技术知识&#xff1a; 1.图像的几何变换图像翻转&#xff1a;使用另一个重载的drawImage(Image img,int x_1,int y_1,目标矩形的第一坐标int x_2,int y_2,目标矩形的第二坐标int x1,int y1,源矩形的第一坐标int x2,int y2,源矩形的第…

VS Code配置C/C++

VS Code 配置C/C  准备工作 Mingw-w64下载&#xff0c;在vscode中&#xff0c;点击帮助文档&#xff0c;进入如下界面。 在左侧选择CMingw-w64 onWindows,进入如下界面。可以参考文档进行配置。 点击文档中的mingw-w64链接进入如下界面。 点击黄色区域链接进入到里面…

人脑启发AI设计:让神经网络统一翻译语音和文本

来源&#xff1a;图灵人工智能作者&#xff1a;Glaciohound编辑&#xff1a;陈彩娴能够统一地理解语音和文本&#xff0c;是人类能够形成通用语言能力的重要原因。那么&#xff0c;人工智能是否也能如此&#xff1f;最近&#xff0c;来自字节跳动和UIUC的研究人员借鉴这一思路&…

32 bit 与 64 bit 程序(2)比较

32 bit 与 64 bit 程序&#xff08;2&#xff09;区别 由于操作系统内存分配的不同&#xff0c;导致软件开发过程中&#xff0c;需要编译不同版本的软件。 几个重要概念&#xff1a; &#xff08;1&#xff09;这里所说的的32位与64位程序&#xff0c;是指经过编译器编译后的可…

2021世界人工智能大会AI Debate:图神经网络是否是实现认知智能的关键?

来源&#xff1a;学术头条2021年7月10日&#xff0c;WAIC&#xff08;2021世界人工智能大会&#xff09;“图神经网络与认知智能前沿技术论坛”在上海世博中心成功举办。清华大学计算机科学与技术系教授李涓子&#xff0c;复旦大学计算机科学技术学院教授黄萱菁&#xff0c;清华…

Tensorflow深度学习应用(筑基篇)

筑基篇 #codinggbk1.张量 用于描述数据&#xff0c;可以理解为多维数组,包含张量的名字&#xff0c;阶数&#xff0c;形状数值类型. Tensor("Add:0", shape(m,n,k), dtypefloat32),表示节点名为Add,0代表第0个输出&#xff0c;shape表示为MxNxK维的数组&…

WPF中自动增加行(动画)的TextBox

WPF中自动增加行&#xff08;动画&#xff09;的TextBox 原文:WPF中自动增加行&#xff08;动画&#xff09;的TextBoxWPF中自动增加行&#xff08;动画&#xff09;的TextBox WPF中的Textbox控件是可以自动换行的&#xff0c;只要设置TextWrapping属性为”Wrap”即可&#xff…