面试之项目问答

本文围绕C++和MFC技术展开,详细介绍了如何在项目中实现Singleton模式,深入探讨了MFC的基础,包括框架程序和消息映射机制,并涉及MFC与Qt的结合使用,以及动态链接库和socket编程、多线程的应用实践。
摘要由CSDN通过智能技术生成

C++实现单例模式

class CSingleton
 {
 private:
     CSingleton() {
     }
     ~CSingleton() {
 9         if (m_pInstance == NULL) {
10             return;
11         }
12         delete m_pInstance;
13         m_pInstance = NULL;
14     }
15     static CSingleton *m_pInstance;
16 public:
17     static CSingleton * GetInstance() {
18         if(m_pInstance == NULL)
19             m_pInstance = new CSingleton();
20         return m_pInstance;
21     }
22 };
23 CSingleton* CSingleton::m_pInstance = NULL;//类的静态成员变量需要在类外边初始化
1.类的构造函数私有,故非类的成员无法引用,将构造类的权利赋给类的成员函数
2.将类的对象和能引用类的构造函数的成员函数变为静态对象,故不需要构造类的对象,直接用类名来调用静态成员函数
目的: 类对象相互依赖的情况,作者想说明情况是使用”单例模式“保证获取的一个静态变量是被初始化的,即类和类间存在引用关系

项目中的Singleton实现

OgreSingleton.h头文件中
template <typename T> class Singleton
{
protected:
static T* ms_Singleton;
pulic:
Singleton(void)
{
assert(!ms_Singleton);
}
}
template <typename T> class Singleton
    {
    protected:

        static T* ms_Singleton;

    public:
        Singleton( void )
        {
            assert( !ms_Singleton );
#if defined( _MSC_VER ) && _MSC_VER < 1200	 
            int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
            ms_Singleton = (T*)((int)this + offset);
#else
	    ms_Singleton = static_cast< T* >( this );
#endif
        }
        ~Singleton( void )
            {  assert( ms_Singleton );  ms_Singleton = 0;  }
        static T& getSingleton( void )
		{	assert( ms_Singleton );  return ( *ms_Singleton ); }
        static T* getSingletonPtr( void )
		{ return ms_Singleton; }
    };

在我们自定义的类的头文件声明中加入了
static classname& getSingleton(void);
static classname* getSingletonPtr(void);
来获得类的唯一实例的对象和对象指针,并在源文件中定义函数
其中首先将单例模板类的对象赋上类型,并给实例赋0
template<>::classname* Ogre::Singleton<classname>::ms_Singleton=0;
定义函数:以ScenarioManager为例
ScenarioManager* ScenarioManager::getSingletonPtr(void)
	{
		return ms_Singleton;
	}
	ScenarioManager& ScenarioManager::getSingleton(void)
	{  
		assert( ms_Singleton );	
		return *ms_Singleton;
	}


MFC基础

1. MFC包含哪几类程序? 其中MFC应用程序又包含哪几类?
2. MFC的中的大多数类都继承自哪个类?
3. MFC主要要用到哪几个类?及其各个类的作用。
4. MFC中有哪6类核心机制?Cobject中封装了哪些机制?
5. 在哪个类的什么函数中进行MFC程序初始化? 相当于main功能的函数。
6. MFC应用程序的启动机制的实现。(几个步骤及相关函数)
7. 窗口的创建及窗口处理函数机制的实现。(几个步骤及相关用到函数)
8. 消息映射机制的原理及实现。宏。(查找消息处理函数的几个步骤及其函数)
9. MFC的消息分类。自注册消息用什么函数进行注册?消息映射宏是什么?
10. MFC菜单、工具栏、状态栏所用的类是什么?
11. 怎么定义一个视图窗口?
12. 划分窗口使用什么类? 划分窗口有哪两类,有什么区别?
13. 运行时类信息 机制的宏,及原理。CRuntimeClass的内容,isKindOf实现方法。
14. 动态创建 机制的宏,及实现。与运行时类信息在内容添加上的区别?
15. 消息的派发会经过哪几个类?一般在哪个类里进行处理?SetActiveView的作用。
16. 单文档、多文档模板类是什么? 保存模板类用什么函数?新建模板用什么函数?
17. 单文档视图的创建过程及所用到的相关函数。
18. MFC绘图有哪几类DC?各自的类名,及区别。
19. MFC有哪几类绘图对象?各自的类名。
20. MFC有哪几类数据集合类?CMAP的底层实现?
21. MFC的文件类是什么?文件查找类是什么?
22. 序列化机制 的宏,怎么使用? 执行>>和<<时进行的内部操作及其相应函数。
23. MFC的对话框的种类,各自怎么使用?及相关函数。
24. 定义对话框数据交换的步骤,及使用方法,实现原理。
25. 通用对话框有哪些,试举例。
26. MFC常用的通用控件有哪些?举出类名。
27. MFC的动态库有哪几种类型?扩展库一般用来做什么?
28. MFC的线程有哪几类? 相互有什么区别?各自的创建方法是什么?
29. VC环境下可以使用哪几类socket? 其中MFC的socket类 有哪几种,各自区别?类名是什么?用什么函数初始化MFC的socket库。

Windows程序是基于消息编程的
Windows消息循环:当又消息产生时,操作系统(内核)会把消息放入应用程序(进程/线程)的消息队列中,应用程序通过GetMessage函数从这个队列中取出一条具体的消息,并通过DispatchMessage函数将消息交给操作系统(内核),后者调用应用程序的窗口过程,即窗口过程函数WndProc进行处理。该函数利用switch-case结构判断并分类处理。
消息路由的实现方式

MFC框架程序


部分MFC类组织结构
CWinApp类应用程序类
在进入main之前执行全局对象CNameApp  theApp的构造,之前会调用父类CWinApp的构造函数
AfxWinMain函数
Afx(Application Framework)应用程序框架函数,全局函数
CWinThread *pThread=AfxGetThread();
CWndApp *pApp=AfxGetApp();
pThreadhepApp调用了三个函数完成了Win32程序需要的几个步骤:设计窗口类、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环、窗口过程函数
文档/视类结构

MFC消息映射机制

发送给窗口的消息是如何被MFC框架通过句柄映射表和消息映射表来用窗口类的处理函数进行响应的
windows消息:WM_LBUTTONDOWN、ON_BN_CLICKED
句柄映射表--MFC在后台维护了一个窗口句柄和对应的C++对象指针的对照表
消息映射表--消息和消息函数静态对照表--源文件头部的消息映射宏将消息和消息响应函数关联起来,一旦有消息产生,程序就会调用相应的消息响应函数来处理
消息处理函数--头文件中的消息响应函数声明(原型)、
当有消息需要处理时,程序搜索该消息静态表,查看该类能否处理此消息,并依照静态表找到并调用对应的消息处理函数
WindowProc()函数--OnWndMsg函数
与对话框上控件相关联的成员变量

MFC和Qt

详述:http://blog.csdn.net/a1937935900/article/details/77926338

MFC中的动态链接库

动态链接库和静态链接库:http://blog.csdn.net/a1937935900/article/details/76917717

MFC中的socket编程和多线程编程实现



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值