求黑执事第四季完整版资源1~3季视频资源,没有微信,只要百度云,要钱就不用了,谢谢。

在ATL中,为什么要把派生类的名字传给基类模版?解决方法 - VC/MFC&&&&>>&& 在ATL中,为什么要把派生类的名字传给基类模版?在ATL中,为什么要把派生类的名字传给基类模版?
class & ATL_NO_VATABLE & CProp & : & pulic & CComCoClass &CProp, & &CLSID_Prop& , & ....------解决方案--------------------这个需要对模版有点了解了吧。
小的我对模版了解还好,
CComCoClass &CProp
看Inside ATL,这个地方我记得是为了COM的厂类做工作的。
从描述上,我觉得最好别说是传递给父类,这个要理解他们的编译顺序了。
------解决方案--------------------这个是ATL的规范吧
LZ去寻一份深入解析ATL之类的书,了解一下ATL的原理吧
有些东西还是自己花点时间有好处
------解决方案--------------------楼上的没一个说到点上。
楼主问为什么要把派生类的名字传给基类模版,解决这个问题最好的办法就是:
1,找到基类的源代码(ATL提供源代码的),拷贝出来;
2,将放置派生类名字的地方,如CComClass的第一个模板参数“class T”,替换为派生类的名字;
3,重新审视修改后的CComClass,源代码能看懂吧?看懂之后自然知道为什么了。
同样的办法,可以用来对付微软SDK里大量的宏,MFC、ATL都有写大量宏的毛病。如果像知道一个宏到底是干什么的,怎么运作的,那么就把宏的源代码找到,拷贝出来,展开在你的类里面,再重新审视一遍即可。
侯老师说,源码面前,了无秘密。
------解决方案--------------------静态多态,基本上都是这样用的.
template &class T&
struct base
T* p = static_cast &T*& (this);
p-& call();
template &class T&
struct Do//假设有几种 Do类似的类,都有一个call成员函数
void call()
do something
strcut test:public base &test& ,public Do &test&
strcut test:public base &test1& ,public Do2 &test&
这样只需要搭配不同的Do类就能搭配出一个完全不同的类.
------解决方案--------------------如果还不大明白的话看 & &C++设计新思维& &
里面讲的很清楚
------解决方案--------------------一个小花招,用来模拟虚函数的功能。
请思考这个问题,怎么让基类的函数优先call到子类的重载函数?这点对类库的写作很重要,
因为类库使用者提供了具体的实现,基类当然要优先考虑子类的。答案就是虚函数
class Base
void interface_fuction()
real_fuction();
protected:
virtual void real_fuction() //不申明virtual那么即便子类有real_fuction()
//基类的interface_fuction调用不到。
重所周知,这样会有一定的消耗,还有没别的方法?有
void interface_fuction()
pDirived-& real_fuction(); //pDirived为继承类指针,这样优先也能call到
//子类的real_fuction(); 前提是需要知道子类
//的类型信息,于是模版就来了
T* pDirived = static_cast &T*& (this); //T为子类类型信息查看: 746|回复: 5
自己建的一个类调用不了基类的虚函数,求解决
阅读权限40
中级会员, 积分 447, 距离下一级还需 53 积分
自己建的一个类调用不了基类的虚函数,求解决
点击启动 应该显示InitWSA成功 和一些其他的状态信息,可我这里只显示InitWSA成功,其他没反应。不知道什么情况。
附件: 您需要
才可以下载或查看,没有帐号?
首先,你明不明白虚函数的调用机理?或者说什么时候调用的是基类中的函数,什么时候调用的是派生类中的函数。
其次,我没有细看你的代码。只是查找搜索了一下你的代码中有没有实例化派生类CCompletionPort。结果发现你的代码中根本就是没有CCompletionPort的实例,连派生类的实例对象都没有,怎样去调用派生类中的函数?
如果你想调用派生类中的虚函数,有两种方法可选。
一个实际指向派生类对象的指针,通过指针调用。
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限60
铜牌会员, 积分 1293, 距离下一级还需 207 积分
雪糕好吃 发表于
你的意思是我new个派生类的对象 就可以实现了?可我的代码里主窗口类即调用了基类也调用的派生类 这可真么 ...
首先,你明不明白虚函数的调用机理?或者说什么时候调用的是基类中的函数,什么时候调用的是派生类中的函数。
其次,我没有细看你的代码。只是查找搜索了一下你的代码中有没有实例化派生类CCompletionPort。结果发现你的代码中根本就是没有CCompletionPort的实例,连派生类的实例对象都没有,怎样去调用派生类中的函数?
如果你想调用派生类中的虚函数,有两种方法可选。
一个实际指向派生类对象的指针,通过指针调用。
一个派生类对象,直接通过成员操作符调用。
根据你的代码中出现的问题,我在SocketIOModelDlg.cpp文件中包括了派生类的定义头文CompletionPort.h。
然后将你原本实例化基类的代码,转变为实例化派生类。则:void CSocketIOModelDlg::Init()
{
& & & & InitView();
//& & & & m_pSocketModel = new CSocketModel();
& & & & m_pSocketModel = new CCompletionPort() ;
}复制代码编译、运行的结果为:
除此之外还会弹出一个对话框,估计这是以为我修改你的代码,导致出错所致。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限60
铜牌会员, 积分 1293, 距离下一级还需 207 积分
不就是显示这些东西吗?还有什么信息要显示的?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限40
中级会员, 积分 447, 距离下一级还需 53 积分
seed-l 发表于
不就是显示这些东西吗?还有什么信息要显示的?
当然有啊 void CCompletionPort::InitCompletionPort()这个函数没有调用成功啊!还应该显示& & & & strNotify.Format(&CCompletionPort::CreateIoCompletionPort OK&);
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限60
铜牌会员, 积分 1293, 距离下一级还需 207 积分
雪糕好吃 发表于
当然有啊 void CCompletionPort::InitCompletionPort()这个函数没有调用成功啊!还应该显示& & & & strNotify.Fo ...
m_pSocketModel = new CSocketModel(); 复制代码这一句的m_pSocketModel实际指向的就是基类,怎么会调用派生类的函数。而你派生类中InitCompletionPort()又是什么都没做。。。。
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限40
中级会员, 积分 447, 距离下一级还需 53 积分
seed-l 发表于
这一句的m_pSocketModel实际指向的就是基类,怎么会调用派生类的函数。而你派生类中InitComplet ...
你的意思是我new个派生类的对象 就可以实现了?可我的代码里主窗口类即调用了基类也调用的派生类 这可真么new啊 麻烦你指点下~
发帖求助前要善用【】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
站长提醒 /2
本着让大家学习到更多更好的VC++编程技术,选择一个适合自己的方向发展下去。VC驿站从即日起招聘教程讲师,主要是VC++方向,可以涉及安全类、破解类、编程开发类等等。
期待您的加盟。。。
为了能给广大编程爱好者提供一个更好的学习交流平台,从即日起面向广大网友特举办《发原创得奖励》活动。Vip教程,驿站U盘,无线鼠标 免费送,礼品丰厚,赶快来参加吧!
VC驿站微信公众号cctry2009
Powered by Discuz! X3.2在VC&Project中&加入无基类&的自定义新类
先是尝试用Class
Wizard将其引入项目,但不成功。后来发现通过“Insert&| New
Class”这条路径 在“Class
type”中有”Generic
Class”选项,经由这条路径成功将CSADirRead类引入项目
----&众所周知VC++的MFC类库为编程者编制好了对数据库操作的类,编程者可
以使用向导建立一个与数据库联结并对数据库进行操作的应用程序,不需要编
制任何代码,这无疑为编程人员提供了一个捷径。但是,使用向导时只有选用基
于单文档或多文档的项目才能选择数据源,与指定的的数据库相连,对用向导生成
的基于对话框的应用程序不提供数据库的支持。即使是基于单文档或多文档的
应用程序,当需要一些特殊的操作,例如,打开一个表,要求返回满足一定条件
的记录集时,MFC并没有提供完全符合要求的现成函数。如果,能利用MFC所提
供的数据库操作,再加上自己设计的函数,也就是说,设计一个对数据库操作
的类,在程序中手工加入这个类,那么就可以在基于对话框的应用程序中实现对
数据库的操作,而且,也可以针对自己应用程序的具体需要来设计类的函数,为
特定功能的实现提供了很大的方便。&
----&在一个涉及数据库操作的应用程序中,常用到的MFC类有CdaoDatabase类、
CdaoTableDef类、CdaoRecordset类和&CdaoQueryDef类,当对数据库进行操作
时,需要先打开数据库,然后打开数据库中的表,再得到查询集和记录集。在自
己定义的类中综合这四个类的操作,设计一个打开表得到查询集和记录集的函
数,以后,在应用程序中使用该类时只需包含该类的头文件,所设计的函数就
可以直接调用了。&
----&建立数据库类的过程可分为如下四步:&
----&一、定义一个无基类的CdataBaseOperate类&
----&1、在Workspace窗口选择ClassView选项卡,在树型类结构图的根部单击
鼠标右键,选择New&Class…,系统将弹出建立新类的对话框;&
----&2、在Class&type中选择Generic&Class;&
----&3、在Name中填写要建的新类的名称,要以大写字母C开头,系统会自动建立
新类的头文件和实现文件,文件的名称为类名去掉第一个大写字母C,如果想改变
文件的名称,可以单击change按钮.&
----&4、在填写好各项后,按OK按钮确定,一个无基类的新类建立成功,但,他
还是一个空类,下一步,就要给类添加内容.&
----&二、在自定义的类中加入有关的定义&
----&1、在本应用程序中,使用ODBC与SQL&SERVER的数据库相连,因而,在类的
实现文件构造函数前加入如下的定义:&#define&SQL_DATABASE&_T("ODBC;
DSN=sql-UID=PWD=")&DSN=sql-database表示建立的ODBC联
接的名称是sql-database,如果选用其他数据库,只需在此改变与所需数据库建
立的联接,或是重新配置sql-database&使之联接新的数据库。UID=PWD=pass
表示登录数据库的用户名是sa,密码是pass,如果密码是空则表示为PWD=""。&
----&2、在该类中综合使用到了MFC类库提供的有关数据库的几个类
CdaoDatabase类、CdaoTableDef类、CdaoRecordset类和CdaoQueryDef类,
而这四个类的定义和实现都包括在头文件afxdao.h中,因此,在新定义的类
的头文件中一定要加上语句:&
&#include&&&afxdao.h&&;
----&3、对要用到的四个类各声明一个对象如下:&
 &CDaoDatabase*&loc_pDataB&&
&&&&CDaoTableDef*&loc_pT
CDaoRecordset&loc_pR&&
&&&&CDaoQueryDef*&loc_pQueryD
----&其中CdaoDatabase类、CdaoTableDef类和CdaoQueryDef类定义了对象指针,
在使用时要先new,最后要delete。以CdaoDatabase类为例,在
CdataBaseOperate类的构造函数中初始化对象指针&loc_pDataBase=new&CDaoD在析构函数中要释放该指针delete&loc_pDataB&
----&三、在自定义的类中加入所需的函数和变量&
----&手工加入函数包括两项工作,首先在头文件中加入函数的声明,然后,在
实现文件中加入函数的具体实现,声明与实现一定要统一;&
----&使用向导加入函数和变量:&
----&1、在Workspace窗口选择ClassView选项卡;&
----&2、在树型类结构图的要添加函数和变量的类上单击鼠标右键,如果加入成
员函数则单击Add&Member&Function,加入虚函数单击Add&Virtual&Function,
加入成员变量单击&Add&Member&Variable;&
----&3、出现对话框后,填写成员函数或变量的名称、类型,系统会自动添加函
数的声明与实现;&
----&4、添加函数的具体操作,可以通过编辑代码进一步填写;&
----&这些操作将会在Workspace窗口的ClassView选项中立即体现出来,并且,
单击ClassView中的相应函数就可进入该函数的实现部分,进行进一步编写代码,
如果做不到这一点,说明添加成员函数的操作有误。&
----&下面以本应用程序为例,给出具体的表结构和几个主要函数的实现,读者
可以根据自己的实际情况设计函数。&
----&本应用程序中的一个典型表的结构是:&
序号&&正题内容&&难度系数&&分值&&&&&&答案&&&&&&备注
整型&&字符型&&&&长整型&&&&双精度&&&&字符型&&&&字符型
----&打开数据库的函数实现如下:&
if&(!loc_pDataBase-&IsOpen())
loc_pDataBase-&Open(&NULL,&FALSE,&
FALSE,&SQL_DATABASE);
----&该函数中用到了CdaoDatabase类的两个函数IsOpen()和Open(NULL,&FALSE,
&FALSE,&SQL_DATABASE),因为已经声明了该类的指针对象loc_pDataBase,所以
可以直接调用CdaoDatabase类的函数。其中,Open()函数中的最后一个参数
SQL_DATABASE在前面已经介绍过,通过他打开相关的数据库。&
----&由于程序中打开表后,不仅要返回所有的记录集,还用到返回满足一定条
件的记录集,因此打开表的函数除了带入表名外还有一个参数难度系数,
lNDXS=0时,选择表中全部数据,&lNDXS=1~n时,表示选择难度系数=1~n的记录。&
bool&CDataBaseOperate::OpenTable
(Cstring&strTableName,long&lNDXS)
loc_pQueryDef-&Create(NULL,Sqlstr);
loc_pRecordset.Open(loc_pQueryDef);
m_nRecordNumber=0;
while(!loc_pRecordset.IsEOF())&
&&&&return&TRUE;&
----&为了维护数据库的安全,表用过后应该关闭,关闭表的同时,要释放在打
开表的操作时初始化的对象指针,例如:delete&loc_pQueryDef。同样要注意,
在构造函数中初始化的对象指针,在析构函数中一定要释放。对象指针的初始化
和释放是成对出现的。&
&&&&loc_pDataBase=new&CDaoD&
&&&&//在构造函数中初始化对象指针。
&&&&Delete&loc_pDataB&&&&&&&&&&&&&
&&&&//在析构函数中释放该对象指针。
----&四、CdataBaseOperate类的应用&
----&1、使用VC++的向导生成一个应用程序,可以根据需要选择基于对话框或
是基于单、多文档,选择单文档或多文档时不要选择数据库支持。&
----&2、在应用程序的主头文件中加入#include&"DataBaseOperate.h",并且还
要声明一个CdataBaseOperate类的对象,public:&CDataBaseOperate&m_CDataBaseO&
----&3、有了指向CdataBaseOperate类的对象后,刚刚在CdataBaseOperate类中
编制的函数都可以通过
"m_CdataBaseOperate .函数名"来调用。&
----&本文是VC++6.0下的CdataBaseOperate类建立与应用的一个初步探讨,
CdataBaseOperate类所实现的功能是很强大的。除了介绍的CdataBaseOperate类
的几个基本而又常用的函数之外,CdataBaseOperate还有很多用于其他方面的功
能函数,在此不一一介绍。CdataBaseOperate类的函数,实现了数据库内容的显
示、修改、添加、删除等功能,基本上满足了数据库操作人员的需要。除了这
些,编程人员还可以根据程序的需要定义自己的特有的函数。&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2001年7月 VC/MFC大版内专家分月排行榜第一
2001年6月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 黑执事第四季完整版资源 的文章

 

随机推荐