@@@@@@ 构造函数 @@@@@

myb123 2002-11-15 12:02:17
class CArchiveEx: pubic CArchive
{
CArchiveEx(UINT nMode);
~CArchiveEx();

CMemFile m_MemFile;
}

CArchiveEx::CArchiveEx(UINT nMode) : CArchive(&m_MemFile, nMode)
{
}

我的问题是如何使数据成员m_MemFile先构造, 再进入基类的构造函数.
因为基类CArchive的构造函数先于数据成员m_MemFile的构造. &m_MemFile此时虽有地址, 但其并未构造, 所以此时调用会出错.请问如何解决?
...全文
64 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_feng_fly 2002-11-25
  • 打赏
  • 举报
回复
看看《c++程序设计语言》或者《c++ primer》,上边应该有。我也忘了我是在什么地方知道的了:)c++在解析那个函数的时候,会发现SayNameA()我传了一个参数是class b,那么编译器会尝试把b转换成a(隐式转换),如果他发现作不到,那么这是一个错误。但是他发现可以通过operator A来达到这个目的,就会使用他了。类似的,构造函数也可以被用来进行隐式转换,如果你不想你的构造函数被用来进行隐式转换,就要加上explicit进行修饰。关于这个关键字你可以看看msdn或者相关书籍
myb123 2002-11-25
  • 打赏
  • 举报
回复
liu_feng_fly(笑看风云 搏击苍穹 衔日月):
老兄啊, 你那段虽然不能直接解决我的问题, 但已经扩展了我的思路. 我一定加40分给你.
老兄啊, 你那招转换函数很绝啊, 你的C++真的很熟啊, 我要多向你学习! 请问转换函数在那本C++书有介绍的? 为什么在传参时会调用到operator A()?
liu_feng_fly 2002-11-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
void SayName()
{
cout << "I'm class A" << endl;
}
};
class B
{
public:
void SayName()
{
cout << "I'm class B" << endl;
}
operator A()//转换函数,让编译器知道如何把Class B转换成A
{
return m_a;
}
private:
A m_a;
};
void SayNameA(A a)
{
a.SayName();
}
void SayNameB(B b)
{
b.SayName();
}
int main(int argc, char* argv[])
{
A a;
B b;

//say A's name
SayNameA(a);

//say B's name
SayNameB(b);

//say A's name,but we provide a class B,
//by operator A(),it can be convert to class A
SayNameA(b);
return 0;
}
希望这段代码能够给你帮助
myb123 2002-11-21
  • 打赏
  • 举报
回复
to : liu_feng_fly(笑看风云 搏击苍穹 衔日月)
转换函数operator CArchive ()怎调用, 能详细点吗?
ixMind 2002-11-21
  • 打赏
  • 举报
回复
我也觉得是程序逻辑的问题,应该重新调整一下思路
sunheart 2002-11-21
  • 打赏
  • 举报
回复
清允许我说几句不能帮你解决问题的话,我觉得CArchive类管理m_MemFile并不合适,最好用它只负责文件流的输入输出,封装文件名不是很合理。能不能改变一下你程序的思路和结构啊。不要再在这儿“浪费”啊
liu_feng_fly 2002-11-18
  • 打赏
  • 举报
回复
如果你不需要用到虚函数的机制,可以考虑写一个转换函数
operator CArchive (),这样问题就解决了
myb123 2002-11-18
  • 打赏
  • 举报
回复
谢谢liu_feng_fly(笑看风云 搏击苍穹 衔日月)了.
我只知道封装是可以, 但封装后要重写很多接口, 或者是有一个
CArchive& GetArchive()才行, 所以我觉得如果能派生那就最方便实用.
myb123 2002-11-15
  • 打赏
  • 举报
回复
to luogucai(萝卜):
先谢谢了, 但若照你的方法,那使用CArchiveEx一定要如下了:
CMemFile* pMemFile = CArchiveEx::CreateMemFile();
CArchiveEx ar(pMemFile, CArchive::store);

我封装此类就是想用户不用在外面调用CMemFile, 而我在类内部实现.要不我不如这样:
class CArchiveEx: pubic CArchive
{
CArchiveEx(CMemFile* pMemFile, UINT nMode);
~CArchiveEx();
}

CArchiveEx::CArchiveEx(CMemFile* pMemFile) : CArchive(pMemFile, Mode)
{
}
调用时如下即可:
CMemFile MemFile;
CArchiveEx ar(&MemFile, CArchive::store);

但我封装此类就是想用户不用在外面调用CMemFile, 而我在类内部实现.
liu_feng_fly 2002-11-15
  • 打赏
  • 举报
回复
这是不可能的,发生这个情况说明你的类的体系设计的有问题:)基类的构造怎么可能依赖于派生类的成员变量呢?
nustchenhf 2002-11-15
  • 打赏
  • 举报
回复
用指针替代
myb123 2002-11-15
  • 打赏
  • 举报
回复
我的类CArchiveEx要在多个地方使用, 若m_MemFile是static类型则惨了. 有没有办法先构造数据成员m_MemFile?
luogucai 2002-11-15
  • 打赏
  • 举报
回复
1.添加静态函数如下:
CMemFile* CArchiveEx::CreateMemFile();
2.更改构造函数如下CArchiveEx(CMemFile* pFile, UINT nMode);
3.更改成员变量定义CMemFile* m_pMemFile;
用户 昵称 2002-11-15
  • 打赏
  • 举报
回复
只能是static类型了
nustchenhf 2002-11-15
  • 打赏
  • 举报
回复
构造次序:
先基类,再数据成员,以此递推。
cwanter 2002-11-15
  • 打赏
  • 举报
回复
这是不可能的。解决办法有二:静态(全局)变量或把变量移到基类中。
liu_feng_fly 2002-11-15
  • 打赏
  • 举报
回复
如果你只是要对CArchive进行包装,那么可能你不需要派生于他,而只是声明一个CArchive的成员变量,那么这个问题就解决了。比如下面
CWrap
{
public:
CWrap(UINT nMode);
private:
CMemFile m_MemFile;
CArchive m_ar;
}
CWrap::CWrap(UINT nMode):m_MemFile(SomeArg),m_ar((&m_MemFile, nMode)
{
}
这样或许可行,因为c++保证,在初始化列表里面的变量的构造依赖于你声明他们的时候的顺序。
如果你先声明CMemFile,后声明CArchive,那么编译器会保证先构造好CMemFile之后再进行CArchive的构造,这样问题就解决了。
liu_feng_fly 2002-11-15
  • 打赏
  • 举报
回复
to myb123(myb123) :
我想没有一个“正规”的解决方法。基类好比“父亲”,派生类好比“儿子”。那么,在“父亲”出生之前是不会有“儿子”存在的,所以“父亲”的出生也不可能依赖于“儿子”。所以,在基类构造完成之前是不存在派生类的,这也是为什么虚函数在构造函数里面不起作用的原因。
如果非要解决这个问题,那么只能是使用一个不依赖于派生类的构造完成的变量,比如全局变量,或者静态变量。这些变量可以在“派生类”构造完成之前就存在了,所以基类可以依赖于他们进行构造。但是这样一来,有何必把他们作为派生类的成员变量(静态的)?他和派生类就几乎没有关系了。只能说明类的体系设计的有问题:)
在c++里面,假如有这样一个继承数。CGrand,CParent,CSon.CSon继承于CParent.CParent继承于CGrand.那么,在执行CSon的构造函数的时候,他首先是一个CGrand,然后是CParent,最后,当构造函数执行完成的时候他才成为CSon.执行析构函数的时候顺序与之相反。
myb123 2002-11-15
  • 打赏
  • 举报
回复
re : liu_feng_fly(笑看风云 搏击苍穹 衔日月)
你说的很有道理, 基类的构造怎么可能依赖于派生类的成员变量呢?基类的构造能依赖于外部,难道无办法依赖于派生类的成员变量吗? 本人对C++了解有限, 不知C++是否能解决这个问题?
ruihuahan 2002-11-15
  • 打赏
  • 举报
回复

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧