真心求解谷歌一道困惑我1个晚上的面试题:两个类可以互为对方的成员吗?如果可以的话,调用过程有神马要注意的吗?看下面代码是如何逻辑

gjskxy1 2011-04-07 02:35:32
真心求解谷歌一道困惑我1个晚上的面试题:两个类可以互为对方的成员吗?如果可以的话,调用过程有神马要注意的吗?看下面代码是如何逻辑


问题1:解释逻辑!注意 CCommunicateV2 继承了 COverlappedBase,它应该也继承了 COverlappedBase的CommandTreeCtrBase *m_pUe成员,CommandTreeCtrBase是CUECtrlV20的基础类;而CUECtrlV20
则有一个叫m_OmtSocket的成员。这里面的逻辑貌似很复杂,谁真心解释解释

问题2:下面的 m_pUe->PostMsgToUE(pMsgBuf); m_pUe是基类指针,是怎么找到子类的PostMsgToUE

问题3:下面有一句话 // CUECtrlV20 * m_pUe; 被注释了,这句话 不注释合逻辑吗?

问题4:如果条件不充分,自己写上可能需要的必须条件(问题精华处)

class CCommunicateV2:public COverlappedBase
{
public:
CCommunicateV2();
~CCommunicateV2();
CRITICAL_SECTION m_csSocket; //神马结构
bool doMsg(UINT8* pDataRcv, UINT32 unDataLen);
// CUECtrlV20 * m_pUe;
};



class CUECtrlV20 :public CTTask,public CommandTreeCtrBase
{
public:
CUECtrlV20();
~CUECtrlV20();
void PostMsgToUE(UINT8 *data);
CCommunicateV2 m_OmtSocket;

}

背景代码

class COverlappedBase
{
public:
COverlappedBase();
~COverlappedBase();
//连接到server
virtual SOCKET ConnectToServer(char* strIP, UINT32 ulPort,CommandTreeCtrBase * pue);
protected:
CommandTreeCtrBase *m_pUe;
}

SOCKET COverlappedBase::ConnectToServer(char* strIP, UINT32 ulPort,CommandTreeCtrBase * pue)
{
m_pUe = pue;
memset(m_pOverlapped,0,sizeof(WSAOVERLAPPED));
......
m_socket = g_sockmanager.ConnectToServer(strIP,ulPort,m_pOverlapped);
return m_socket;
}

CSocketManage g_sockmanager;

SOCKET CSocketManage::ConnectToServer(char * strIP,UINT32 ulPort,PER_IO_OPERATION_DATA * lpPerIoData)
{

......

调用部分:
一、bool CCommunicateV2::doMsg(UINT8* pData, UINT32 unDataLen)
{
if (NULL != m_pUe)
{
m_pUe->PostMsgToUE(pMsgBuf);
}
}
二、if (!m_OmtSocket.IsServerConnected())
{

if (!m_OmtSocket.ConnectToServer(strUeIpAddr, pPara->ulUePort,this))

{
......
}
...全文
417 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
gjskxy1 2011-04-25
  • 打赏
  • 举报
回复
继续讨论 兄弟兄弟
gjskxy1 2011-04-24
  • 打赏
  • 举报
回复
恩 那和观察者 模式 有什么关系呢
驴被脑袋踢了 2011-04-22
  • 打赏
  • 举报
回复
好东西,中午先MARK一下, 晚上回去学习,谢谢楼主分享和各位的解答
gjskxy1 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 quwei197874 的回复:]
两个类可以互为对方的成员
要注意的是 :
class B;
class A
{
B *b; //这不能是变量,只能是指针或引用.
};

class B
{
A a; //这里都可以
A *a;
}
[/Quote]

为什么 不能是变量,只能是指针或引用.
Learn-anything 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gjskxy1 的回复:]

引用 7 楼 quwei197874 的回复:
两个类可以互为对方的成员
要注意的是 :
class B;
class A
{
B *b; //这不能是变量,只能是指针或引用.
};

class B
{
A a; //这里都可以
A *a;
}


为什么 不能是变量,只能是指针或引用.
[/Quote]

因为此时B还么有定义,只是声明
Sou2012 2011-04-22
  • 打赏
  • 举报
回复
= =。。严重怀疑这道题目是不是出自google
qq120848369 2011-04-22
  • 打赏
  • 举报
回复
互相依赖类的定义,不可能互相拥有对象成员.

只能让其中某一个拥有另外一个的指针或者引用,或者干脆两个都用指针更无脑.
zhangxing3134 2011-04-22
  • 打赏
  • 举报
回复
假设class A class B
如果 A包含B的对象的话,我觉得B就不能包含A的对象了(但是可以包含A的指针)

我的理由是这样的:
假如我要初始化一个A的对象那就得初始化一个B的对象,
要初始化B的对象就要初始化A的对象,这样的话构造函数之间循环掉用。

就好像一个类不能包含自己的对象一样,那样会造成自己的构造函数循环调用。
就是这样:A>A>A>A>A>
两个类互相包含对象会也会那样,循环调用的周期长一点罢了
就是这样:A>B>A>B>A>B

自己想的啊 说的不对不要骂我啊
gjskxy1 2011-04-22
  • 打赏
  • 举报
回复
继续讨论
wesweeky 2011-04-21
  • 打赏
  • 举报
回复
可以的 就想C里面的struct 表示链表结点一样
失落的凡凡 2011-04-21
  • 打赏
  • 举报
回复
必然不可以。只能用指针代替。
xmu_才盛 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gjskxy1 的回复:]
引用 10 楼 majia2011 的回复:
函数指针,回调,用了n年了,不过是用类封装一下,没啥

求结合我代码分析
[/Quote]

就你这种不动脑思考,什么事情都等着别人替你做的态度, 还想进google, 你当google没人了吗?
gjskxy1 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 majia2011 的回复:]
函数指针,回调,用了n年了,不过是用类封装一下,没啥
[/Quote]
求结合我代码分析
noock 2011-04-14
  • 打赏
  • 举报
回复
首先,说“成员”指哪种类型的,引用和指针可以,例如类A和B,A可以包含B类型的指针或引用,B同时也可以包含A类的指针或引用,这个没有问题,但不可以互相包含普通变量,例如
class B;
class A{
B* _pb; // OK
B& _rb; // OK
//B _b; // ERROR
};

class B{
A* _pa; // OK
A& _ra; // OK
A a; // OK
};

int main( void )
{
return 0;
}

因为在定义普通的变量时编译器为计算内存占用,需要在编译期进行内存分配,而指针的长度是固定的,不论什么类型的指针,对于同一架构的CPU来讲都是一样的,就是地址的宽度,而引用其实就是外部变量的一个别名,实际上并不需要占用内存,但编译器内部可能会通过指针的方式来实现,即使这样分配的内在也可以在编译期确定
quwei197874 2011-04-14
  • 打赏
  • 举报
回复
第二个问题用多态就行了阿.
quwei197874 2011-04-14
  • 打赏
  • 举报
回复
两个类可以互为对方的成员
要注意的是 :
class B;
class A
{
B *b; //这不能是变量,只能是指针或引用.
};

class B
{
A a; //这里都可以
A *a;
}
pathuang68 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 frankhb1989 的回复:]

两个类显然无法互为对方的成员。
一个类是一个类型,在C++中嵌套类无法分离定义。
两个类的实例也无法互为对方的成员。
因为成员类型定义处要求具有完整类型,而不能只是前向声明。
至少有一个不直接定义类的实例作为成员实现类似逻辑是可行的。参考PImpl idiom。
下面代码的逻辑么……LZ自己解决。
[/Quote]

你要是对设计模式稍有了解,就不会这么说啦。
xmu_才盛 2011-04-14
  • 打赏
  • 举报
回复
两个类可以互为成员, 典型的应用 是设计模式中的观察者模式
class View // 用来观察每个目标变化
{
CTarget1 sub1;
CTarget2 sub2;
……
}
class CTarget1 // 有变化时要通知观察者
{
CView pView;
}



在编写的时候一定要注意这样一个问题, 即头文件的循环引用,可以采取这样的办法
// View.h
#include "CTarget1.h"
#include "CTarget2.h"
#include "CTarget3.h"
……

// Target1.h
class CView; // 先声明外部定义
classCTarget1
{
CView m_pView;
}

// Target1.cpp // 把头文件的引入放在cpp中,就可以防止 Target1.h 与 View.h 的循环引用了
#include "View.h"
FrankHB1989 2011-04-14
  • 打赏
  • 举报
回复
两个类显然无法互为对方的成员。
一个类是一个类型,在C++中嵌套类无法分离定义。
两个类的实例也无法互为对方的成员。
因为成员类型定义处要求具有完整类型,而不能只是前向声明。
至少有一个不直接定义类的实例作为成员实现类似逻辑是可行的。参考PImpl idiom。
下面代码的逻辑么……LZ自己解决。

pathuang68 2011-04-14
  • 打赏
  • 举报
回复
可以肯定,两个类可以互为对方的成员。
加载更多回复(2)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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