首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

错误C2248:'CObject::CObject‘:当我在MFC中调用hDC.SelectObject函数时,无法访问在类'CObject’中声明的私有成员

错误C2248是一个编译错误,它表示在MFC中调用hDC.SelectObject函数时无法访问在类'CObject'中声明的私有成员。

在MFC中,CObject是一个基类,它提供了一些通用的功能和方法。在CObject类中,有一个私有成员函数CObject::CObject,它是一个构造函数,用于初始化CObject对象。由于它是私有的,所以无法直接访问。

hDC是一个设备上下文句柄,它用于绘制图形和文本等操作。SelectObject函数是一个GDI函数,用于选择一个对象(如画笔、画刷、字体等)到设备上下文中,以便后续的绘制操作使用该对象。

当调用hDC.SelectObject函数时,编译器会尝试调用CObject的构造函数来创建一个临时的CObject对象,然后将该对象传递给SelectObject函数。但由于CObject的构造函数是私有的,所以编译器无法访问它,导致编译错误C2248的发生。

要解决这个错误,可以考虑以下几种方法:

  1. 检查代码中是否有直接调用CObject的构造函数的地方,如果有,尝试修改代码,避免直接调用私有构造函数。
  2. 确保在调用hDC.SelectObject函数之前,已经创建了一个有效的CObject对象,并将其作为参数传递给SelectObject函数。
  3. 检查是否包含了正确的头文件和库文件,以确保CObject类的定义和实现可见。

腾讯云相关产品和产品介绍链接地址: 腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储、人工智能等。以下是一些相关产品和链接地址:

  1. 云服务器(CVM):提供弹性、可靠的云服务器实例,满足不同规模和需求的应用场景。详情请参考:https://cloud.tencent.com/product/cvm
  2. 云数据库(CDB):提供高性能、可扩展的关系型数据库服务,支持MySQL、SQL Server、PostgreSQL等。详情请参考:https://cloud.tencent.com/product/cdb
  3. 云存储(COS):提供安全、可靠的对象存储服务,适用于存储和处理各种类型的数据。详情请参考:https://cloud.tencent.com/product/cos
  4. 人工智能(AI):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等。详情请参考:https://cloud.tencent.com/product/ai

请注意,以上链接仅供参考,具体的产品和服务详情以腾讯云官方网站为准。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ASSERT_VALID和ASSERT宏分析

事实上,ASSERT_VALID宏就是转化为对象成员函数AssertValid()调用,只是这种方法更安全。它参数是一个对象指针,通过这个指针来调用AssertValid()成员函数。...与此相配套,每当我们创建从Cobject继承而来一个新,我们可以重载该成员函数,以执行特定合法性检查 ASSERT_VALID强制调用参数对象(必须是CObjectCObject*)AssertValid...函数,该函数实现对象内部一致性检查,当你创建一个可重用,应该重载这个函数(VC缺省已经重载了该函数),你可以函数中进行必要检查工作....以上两个宏均只Debug版本中有效,与ASSERT相对应是VERIFY.VERIFY宏Debug版本与ASSERT相同,Release版本仅执行参数表达式,不进行校验....ASSERT 和 ASSERT_VALID 都是用于Debug,当括号表达式为FALSE,会弹出对话框通知, 你可以自己加上一句ASSERT(FALSE),看看执行时有什么东东。

80620

MFC常用详细介绍

常用MFC CRuntimeClass结构 CRuntimeClass结构定义了名、对象所占存储空间大小、版本号等成员变量及动态创建对象、派生关系判断等成员函数。...CObject MFCCObject为程序员提供了对象诊断、运行时类型标识和序列化等功能。...(1) 对象诊断:利用成员函数AssertValid进行对象有效性检查;利用成员函数Dump输出对象数据成员值,诊断信息以文本形式放入一个数据流,用于调试器输出窗口信息显示。...CCmdTargetCObject直接派生,所有能实行消息映射MFC。...MFC应用程序中有且仅有一个CWinApp派生对象,代表程序运行主线程,代表应用程序本身。 CWnd 由CCmdTarget直接派生,是MFC中最基本GUI对象。

1.2K50

ASSERT_VALID(pDoc)分析

事实上,ASSERT_VALID宏就是转化为对象成员函数AssertValid()调用,只是这种方法更安全。它参数是一个对象指针,通过这个指针来调用AssertValid()成员函数。...与此相配套,每当我们创建从Cobject继承而来一个新,我们可以重载该成员函数,以执行特定合法性检查 ASSERT_VALID强制调用参数对象(必须是CObjectCObject*)AssertValid...函数,该函数实现对象内部一致性检查,当你创建一个可重用,应该重载这个函数(VC缺省已经重载了该函数),你可以函数中进行必要检查工作....以上两个宏均只Debug版本中有效,与ASSERT相对应是VERIFY.VERIFY宏Debug版本与ASSERT相同,Release版本仅执行参数表达式,不进行校验....ASSERT 和 ASSERT_VALID 都是用于Debug,当括号表达式为FALSE,会弹出对话框通知, 你可以自己加上一句ASSERT(FALSE),看看执行时有什么东东。

27820

(以MFC框架讲解)

"); 反回是实例对象 但是具体怎么做 首先我们要解决问题 1.我们要知道子类名字 2.怎么识别子类 关于第一种,我们可以我们每个框架里面,添加一个虚函数,名字叫做 GetClassName...二丶MFCRTTI 通过上面的讲解,我们理解了什么是RTTI,那么对应到MFC框架,我们看一下MFC是怎么做 class CMyRuntimeClass { public: // Attributes...//初始化数据 }; 可以看出,MFC框架,成员保存比我们多,且加了很多额外属性 但是核心属性是不变....三丶理解RTTI实现,以及框架过程. 框架,我们仿照MFC 分别添加了 1. CMyMainFrom ,  这个是框架 2. CMyView    视图 3....一丶CMyObject添加类型识别. ? 声明和实现我们用宏替代. ? 二丶CMyObject添加实现方法 ? 实现 实现一,初始化RTTI表 ? 实现二,函数返回自己本身. ?

657100

windows窗体线程异常_指针声明和使用时有何不同

大家好,又见面了,我是你们朋友全栈君。 多线程设计,许多人为了省事,会将对话框或其它指针传给工作线程,而在工作线程调用该类成员函数成员变量等等。...但是Debug版本某些情况下,特别是工作线程调用pWnd->UpdateData(FALSE),会出现错误。...正因为如此,MFC只是Debug版本才有这个ASSERT_VALID问题存在,Release版本却没有,因为它没有理由来阻止我们用。...虽然如此,但是毕竟我们调试许多时候是要用到Debug版本MFC的如此做法还是给我们带来了诸多不变,幸运是,MFC将它真正检测线程相关MFC对象代码做成了虚拟函数,也就是说,我们可以重载它,这样...下面,让我们热烈欢迎我们今天主角出场-- virtual void CObject:: AssertValid( ) const; ASSERT_VALID最后会调用MFC对象

47540

控制对象创建方式(禁止创建栈对象or堆对象)和创建数量

} }; 上面的创建栈对象,如NoStackObject obj;编译将会报错,而采用new方式,编译就会通过。...我们可以用间接办法完成,即让这个提供一个static成员函数专门用于产生该类型堆对象。(设计模式singleton模式就可以用这种方式实现。)...游戏设计,我们采用CGameWorld作为游戏场景抽象描述。...如果我们想让对象产生个数不是一个,而是最大为N(N>0)个。可以内部设置一个静态计数变量,调用构造函数,该变量加1,当调用析构函数,该变量减1。...阅读上面的示例代码还需要注意抛出异常没有对象,即throw后没有对象,有两种含义: (1)如果throw;catch块或被catch块调用函数中出现,表示重新抛出异常。

1.9K20

MFC原理第三讲.RTTI运行时类型识别

二丶C++简单RTTI运行类型识别   讲解我们要搞清楚问题时候.写一个简单小例子. 使用C++自带 编译RTTI程序. 注意是编译. 具体做法:   1....变量 则可以调用 类型 名::成员变量 = 值;   2.const关键字修饰变量只能读不能改....初始化时候在外部进行初始化 const 类型 名::成员变量 = 值; 四丶MFC为什么自己构建RTTI   MFC因为出现年代比较早.所以自己实现了RTTI....这个宏就是定义了一个 自己一个CRuntimeClass 结构成员.并且添加了一个获取自己这个成员一个虚函数.   3....实现宏IMPLEMENT_DYNAMIC 其实就是对DECLARE_DYNAMIC 定义CRuntimeClass成员进行初始化. 并且实现了 获取自己这个成员函数.

1.3K30

滴水逆向初级-C++(三)

3.1.封装 1、什么是封装: 将函数定义到结构体内部,就是封装。 2、什么是: 带有函数结构体,称为。 3、什么是成员函数: 结构体里面的函数,称为成员函数。...如果基函数没有任何实现意义,那么可以定义成纯虚函数: virtual 返回类型 函数名(参数表)= 0; 含有纯虚函数被称为抽象(abstract class),不能创建对象...虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态形式调用,而纯虚函数必须在 子类(sub class)实现该函数才可以使用。 2、什么是多态?...多态就是可以让父指针有多种形态。 C++是通过虚函数实现多态性。...如果有父,要显示调用重载赋值运算符。

57510

MFC原理第一讲.MFC本质.以及手工编写MFC程序

写这篇博客之前.已经写了3篇MFC本质了.不过掌握知识点太多.所以从简重新开始. 一丶MFC本质是什么.   MFC本质其实就是Win32程序一种封装....首先就是不管那个.顶层就是CObject. CWinAPP顶层Cobject CFrameWnd也是. 总的来说. 这两个一个是保存数据.一个是跟窗口有关....三丶如何开始编写一个简单MFC窗口   既然上面我们熟悉了两个作用. 那么还要熟悉里面的成员方法.   CWinApp 里面的 InitInstance虚函数. 这个主要是保存窗口句柄....编写MFC步骤.   1.创建Win32工程.   2.添加一个头文件.跟一个.cpp文件.   3.头文件定义字节 CMyApp 并且继承 CWinAPP....m_pMainWnd. m_pMainWnd成员是专门保存窗口句柄.这个成员CWinThread定义.

2.3K40

基于VC2019开始C++之第一个MFC程序(画图)

graphz.h graph.h添加下面的代码: #pragma once class graph : public CObject{protected: //边框 DECLARE_SERIAL...list std::list graphList; 因为调用了list,所以framework.h添加 #include 这里要调用用OnRectangle()函数...= pDoc->graphList.end(); ++v) { (*v)->onDraw(pDC); }} 接下来通过向导添加消息 添加鼠标左键按下消息,左键松开消息,鼠标移动消息 在生成按键按下函数...总结: 1.学会了如何添加项目工程 2.学会了添加用户自己源文件和头文件,并且与项目关联 3.学会了向导 4.学会了按键控件生成,和通过消息ID跟函数关联起来 附录:完整项目工程 参考文献: (...1)vs2019 MFC实现office界面的画图小项目(超超级详细) (2)vs2019使用MFC快速构建简单windows窗口程序

3.2K30

基于VS2019开始C++之第一个MFC程序

graphz.h graph.h添加下面的代码: #pragma once class graph : public CObject { protected: //边框 DECLARE_SERIAL...list std::list graphList; 因为调用了list,所以framework.h添加 #include 这里要调用用OnRectangle...生成下面的图形,矩形可以移动,可拉伸 点击项目中属性,配置属性中选择高级,MFC使用 静态库,在编译一次,生成.exe可以其他电脑上不依赖动态库也能打开了。...总结: 1.学会了如何添加项目工程 2.学会了添加用户自己源文件和头文件,并且与项目关联 3.学会了向导 4.学会了按键控件生成,和通过消息ID跟函数关联起来 参考文献: (1)vs2019 MFC...实现office界面的画图小项目(超超级详细) (2)vs2019使用MFC快速构建简单windows窗口程序

1.3K20

最常用两种C++序列化方案使用心得(protobuf和boost serialization)

3.3 MFC Serialization Windows平台下可使用MFC序列化方法。MFCCObject 序列化提供内置支持。...因此,所有从 CObject 派生都可利用 CObject 序列化协议。 MSDN介绍 3.4 .Net Framework .NET运行时环境用来支持用户定义类型流化机制。...它在此过程,先将对象公共字段和私有字段以及名称(包括所在程序集)转换为字节流,然后再把字节流写入数据流。随后对对象进行反序列化时,将创建出与原对象完全相同副本。...(3)protobuf嵌套后会改变名称 protobuf支持嵌套,即在一个自定义类型可以定义另一个自定义类型,但注意嵌套自定义类型经过protobuf处理后生成名称并不是你定义名称...这样条件往往很难满足,因为我们定义类属性一般都是private,如果是这样,且仍想要使用非侵入性质,那么需要在添加以下声明来开放访问给 serialization 库: friend class

6.7K42

框架原理第一讲,熟悉常用设计方式.(以MFC框架讲解)

MFC单文档框架其底层是封装SDK消息循环 首先我们要实现自己框架,就要封装了.怎么封装,或者说哪里比较困难? 1. API调用困难,所以封装 2. API参数多,所以封装. 3....API调用困难,我们可以封装成一个 处理消息回调.我们也可以封装成一个, 既然封装成,那么就要使用虚函数进行操作了. 1.首先封装WMain函数 2.每个都要有一个公公,这样可以添加公共接口...CTestWinApp,前面几个只是模拟MFC框架,自己定义,当我们用应用程序向导建立时候.则会生成自己(CTestWinApp)并且继承自CMyWinAPP 二丶封装WMain函数 按照...MFC但文档框架 1.封装WinMain 2.自己WMain执行初始化代码.初始化用户全局对象 因为我们显示窗口或者注册窗口时候,需要调用用户InitInstance进行初始化....此时就该进行消息循环了. 4.1添加虚函数消息.并实现 4,2 自己封装wmain进行调用. 我们最基础框架已经搭建完成.

1.6K110

.net学习之路——调试程序

调试工具分为两,一是被动,你等待它们告诉你问题;还有一是主动,允许你程序运行时深入观察,并在逐步运行代码是进行查看。   如果要检验程序中生成各种假设是否正确可以用以下几个宏来实现。...注意不要让宏实现任何功能,因为程序生成这些调试用宏都会自动删除。     ...ASSERT_VALID(pObject);这条语句用来测试程序对象是否合法,以及对象内部声明是否准确无误。传入参数是一个实例化c++对象。...#注意不是对所有的对象都起作用,对象必须是从CObject继承而来,对标准MFC来说是满足,但如果要测试自己写就要注意满足这些要求了。     ...也就是说前一个参数为名,后一个参数为对象名。     4.VERIFY(bAssumption);这个与第一个功能一样,但是它有个特性就是发布生成逻辑表达式不会被删除。

41720

Java 观察者模式

(发布订阅)模式,因此弄清开始SpringBoot事件监听机制源码分析前,先来学习下观察者模式,嘿嘿。...这个接口有一个update()方法,当主题(Subject)状态改变时调用它。 •ConcreteSubject,存储ConcreteObserver对象兴趣状态。...当状态改变,它会向观察者发送通知。具体主题总是实现主题接口。notifyObservers()方法用于状态更改时更新所有当前观察者。.../jinyue/observer 编写代码前,我们头脑中应该有一个图,要新建什么之间关系是什么?...就像建房子一样,得先搭好房屋基本框架,然后再砌墙。此时图关系就是房屋基本框架,然后我们根据这个图去填充代码即可。 ?

68010
领券