互相包含的类如何声明

wwwlgb 2000-06-29 11:59:00
有两个类CParent,CSon.CParent 有一个CSon的成员、一个返回自己的朋友数量的成员函数、一个返回儿子同学数量的成员函数;CSon有一个CParent的成员、一个返回自己的同学数量的成员函数,一个返回父亲朋友数量的成员函数。
编译时在两个“****”处出错,错误信息
e:\test\son.h(18) : error C2079: 'm_parent' uses undefined class 'CParent'

e:\test\parent.h(19) : error C2079: 'm_son' uses undefined class 'CSon'
类使用类向导生成。
头文件parent.h
#if !defined(AFX_PARENT_H__DBCE2E48_4D66_11D4_8FAF_0050BA0694EB__INCLUDED_)
#define AFX_PARENT_H__DBCE2E48_4D66_11D4_8FAF_0050BA0694EB__INCLUDED_

//#include "Son.h" // Added by ClassView
class CSon;
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CParent
{
public:
int FriendCount();
int ClassmateCountOfSon();
CSon m_son;
CParent();
virtual ~CParent();

};

#endif // !defined(AFX_PARENT_H__DBCE2E48_4D66_11D4_8FAF_0050BA0694EB__INCLUDED_)

实现文件Parent.cpp:
// Parent.cpp: implementation of the CParent class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Test.h"
#include "Son.h"
#include "Parent.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//written by lgb
//#include "Son.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CParent::CParent()
{

}

CParent::~CParent()
{

}

int CParent::ClassmateCountOfSon()
{
return m_son.ClassmateCount();
}

int CParent::FriendCount()
{
return 10;
}

头文件Son.h
// Son.h: interface for the CSon class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SON_H__DBCE2E49_4D66_11D4_8FAF_0050BA0694EB__INCLUDED_)
#define AFX_SON_H__DBCE2E49_4D66_11D4_8FAF_0050BA0694EB__INCLUDED_

//#include "Parent.h" // Added by ClassView
class CParent;
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CSon
{
public:
int FriendCountOfParent();
CParent m_parent;
int ClassmateCount();
CSon();
virtual ~CSon();

};

#endif // !defined(AFX_SON_H__DBCE2E49_4D66_11D4_8FAF_0050BA0694EB__INCLUDED_)

实现文件Son.cpp

// Son.cpp: implementation of the CSon class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Test.h"
#include "Parent.h"
#include "Son.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//written by lgb

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSon::CSon()
{

}

CSon::~CSon()
{

}

int CSon::ClassmateCount()
{
return 5;
}

int CSon::FriendCountOfParent()
{
return m_parent.FriendCount();
}

请各位高手指教!!!不胜感激!!!
...全文
245 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Truing 2000-06-30
  • 打赏
  • 举报
回复
在CSon.h或CParent.h中包含另一个类的头文件.
wwwlgb 2000-06-30
  • 打赏
  • 举报
回复
“如果视图类,比如CTestSocketServerView含有一个类型为用类向导生成的类,比如CListenSocket“应改为:
“如果视图类,比如CTestSocketServerView含有一个类型为用类向导生成的类,比如CListenSocket的成员“
wwwlgb 2000-06-30
  • 打赏
  • 举报
回复
非常感谢Dlf和Truing,帮我解决了这个问题。另外我发现:
用mfc的应用向导生成的应用程序,如果视图类,比如CTestSocketServerView含有一个类型为用类向导生成的类,比如CListenSocket.那这个自定义的类CListenSocket的成员函数,如想调用视图类CTestSocketServerView的成员函数,在CListenSocket的实现文件ListenSocket.cpp中仅仅包含CTestSocketServerView的头文件TestSocketServerView.h编译不能通过,必须同时包含相应框架类的头文件MainFrm.h、文档类的头文件TestSocketServerDoc.h"、视图类的头文件TestSocketServerView.h、ListenSocket.h编译才能通过,可我的自定义的类CListenSocket并没有调用框架类或文档类的东东!不知何故,请各位指点。
ad 2000-06-30
  • 打赏
  • 举报
回复
你这样做绝对不行,你看,CSon里有CParent,CParent里有CSon,无限递归,这两个类的实际大小为无穷大,编译当然不会通过。
应该这么做:

xxxx.h
class CSon;
class CParent;

class CSon{
//some data
CParent *m_pParent;

CSon();
~CSon();
void SetParent(CParent *);
int GetParentFriendCount();
int GetClassmateCount();
};

class CParent{
//some data
CSon *m_pSon;

CParent();
~CParent();

void SetSon(CSon *);
int GetSonClassmateCount();
int GetFriendCount();
};

xxxx.cpp
CSon::CSon()
{
m_pParent = NULL;
}

void CSon::SetParent(CParent *p)
{
m_pParent = p;
}

int CSon::GetParentFriendCount()
{
if(m_pParent != NULL) return m_pParent->GetFriendCount();
else return -1; //mean no parent, or show an error message
}

int CSon::GetClassmateCount()
{
return xxx;
}

CParent::CParent()
{
m_pSon = NULL;
}

void CParent::SetSon(CSon *p);
{
m_pSon = p;
}

int CParent::GetSonClassmateCount()
{
if(m_pSon != NULL) return m_pSon->GetClassmateCount();
else return -1; //mean error
}

int CParent::GetFriendCount()
{
return xx;
}
wwwlgb 2000-06-29
  • 打赏
  • 举报
回复
刚才漏标了两处“***”
两处“***”地方是
1: CSon m_son;
2: CParent m_parent;
Dlf 2000-06-29
  • 打赏
  • 举报
回复
一边必须用指针
class CParent
{
...
CSon son;
...
}
CPatent::xxxxx()
{
son.SetParentPt(this);
}

class CSon
{
...
CParent* pParent;
...
void SetParentPt(CParent* p)
}
Kenny 2000-06-29
  • 打赏
  • 举报
回复
其中的一边必须用指针,动态new.

16,471

社区成员

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

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

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