基础知识,送分题
帮忙看看;
我定义了类A,B,LIKE THIS:
class A
{
B b;
}
class B
{
A a:
}
怎么才能让它编译通过?用什么与预编译命令?还是.......
记得学过,忘了,不好意思;
问题点数:65、回复次数:29Top
1 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 13:25:50 得分 0
不可能通过的Top
2 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 13:26:58 得分 3
除非
class B
{
A* a:
}
或
class A
{
B b;
}
Top
3 楼mensong(吉他乐手)回复于 2002-02-01 13:27:28 得分 1
这种问题你怎么想出来的?Top
4 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 13:27:35 得分 0
除非
class B
{
A* a:
}
和/或
class A
{
B *b;
}
Top
5 楼gpmn(冷血动物)回复于 2002-02-01 13:28:30 得分 0
绝对可以,学c语言时我记得有方法;Top
6 楼gpmn(冷血动物)回复于 2002-02-01 13:29:20 得分 0
我现在碰到了,当然就想到了,呵呵,qq,15938453,欢迎讨论Top
7 楼thd111(小蛐蛐)回复于 2002-02-01 13:30:03 得分 1
有错误么,哈哈 Top
8 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 13:30:29 得分 0
绝对不可以,除非编译器有BugTop
9 楼gpmn(冷血动物)回复于 2002-02-01 13:32:28 得分 0
我定义的两个类,相互都以对方的指针作为成员变量,手边没书,哪个老大帮忙翻翻书Top
10 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 13:32:36 得分 0
C/C++不可能的,倒是delphi/pascal可以Top
11 楼jeffchen(Jeff)回复于 2002-02-01 13:32:39 得分 30
使用超前声明
classA.h
class B;
class A
{
...
}
ClassA.cpp
#include "ClassA.h"
#include "ClassB.h"
ClassB.h
class A;
class B
{
...
}
同样ClassB.cpp也要包含ClassA.h
Top
12 楼musicbug()回复于 2002-02-01 13:33:33 得分 0
不可能编译通过,因为无穷递归.会占用无穷的空间.Top
13 楼jeffchen(Jeff)回复于 2002-02-01 13:34:00 得分 0
不会的不要说不行!!Top
14 楼gpmn(冷血动物)回复于 2002-02-01 13:34:20 得分 0
我的类都很小,因此定义在一个头文件里面,也可以搞定吗?楼上的jeffchen?Top
15 楼gpmn(冷血动物)回复于 2002-02-01 13:36:36 得分 0
e:\gp's project\chessmanager\chessmanager\DataDef.h(23): error C2079: 'ChessProc::mSteps' uses undefined struct 'StepInfo'
e:\gp's project\chessmanager\chessmanager\DataDef.h(38): error C2159: more than one storage class specified
struct StepInfo;
typedef struct ChessProc //一个参考图对应一个棋程;联合起来构成全部一个棋谱;
{
StepInfo* pParent_StepInfo; //指向被参考的那一步;如果有的话;
ChessProc* pBrother_ChessProc; //同一被参考的落子的下一个参考图;如果有的话;
StepInfo mSteps[450]; //由每一步组成的该棋程的数组;
int nBeginOrder,nEndOrder; //起手和结手的编号;
CString mStrProcRemark; //对本图的评论;
ChessProc()
{
pParent_StepInfo = NULL;
pBrother_ChessProc = NULL;
nBeginOrder = 0;
nEndOrder = 0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
typedef struct StepInfo //每一手棋的相关信息;
{
//variables;
short nOrder,nXpos,nYpos; //手数,横纵坐标;
Chessman chessman; //本手是黑是白还是空;
ChessProc* pChild_ChessProc; //对本手的参考图;
CString mStrStepRemark; //对本手的评论;
StepInfo()
{
nOrder=-1;
nXpos=-1;
nYpos=-1;
chessman=none;
}
}
Top
16 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 13:37:21 得分 0
绝对不行!不是我不会,是C/C++标准不允许!Top
17 楼gpmn(冷血动物)回复于 2002-02-01 13:40:55 得分 0
学过编译的话,应该知道这不是问题,编译器很容易解决这种形式的递归问题;
因为我定义的是指针,可以预先知道大小的;如果真的用的是类变量的话肯定如solar兄所说了Top
18 楼jeffchen(Jeff)回复于 2002-02-01 14:02:04 得分 0
可以在同一个头文件里,但所有的class XXX;都要放到前面。
如:
class A;
class B;
class A
{
...
};
class B
{
...
};
不会的不要说不行!!!!
Top
19 楼gpmn(冷血动物)回复于 2002-02-01 14:04:14 得分 0
这样,我把我的问题改一下,全部成了指针成员变量;
class A
{
B* b;
}
class B
{
A* a:
}
文档视图模型里面我用基类躲开了这个问题,但躲得了初一躲不了十五,大家一起看看Top
20 楼jeffchen(Jeff)回复于 2002-02-01 14:07:32 得分 0
呵呵…………躲是躲不掉的Top
21 楼gpmn(冷血动物)回复于 2002-02-01 14:25:41 得分 0
还是没搞定;
互用指针绝对可以,只是怎么用啊?
jeffchen兄,还是没搞定;
msdn上的代码:
// defining_class_types.cpp
class Tree
{
public:
void *Data;
Tree *Left;
Tree *Right;
};
int main()
{
}
递归肯定是可以的
Top
22 楼gpmn(冷血动物)回复于 2002-02-01 14:27:33 得分 0
不会逼我传void指针吧!sigh!!Top
23 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 15:03:37 得分 0
不必互用指针,只要有一个是指针就行了!
#include <iostream>
using namespace std;
class CA;
class CB;
class CA
{
public:
CB* m_pb;
};
class CB
{
public:
CA* m_pa;
};
int main(int argc,char *argv[])
{
CA a;
CB b;
a.m_pb = &b;
b.m_pa = &a;
return 0;
}
Top
24 楼gpmn(冷血动物)回复于 2002-02-01 15:06:49 得分 0
solar兄搞定了吗?我试一下;solar兄用的是vc6?我用的vc.net,刚才搞不定啊!Top
25 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 15:08:04 得分 30
vc6,gcc3.01Top
26 楼gpmn(冷血动物)回复于 2002-02-01 15:12:30 得分 0
昏了,我的代码肯定还有错,不是这里的问题;
solar兄的代码能通过;
我大概还是没记错哦,呵呵!
谢谢solar,jeffchen;散分,发压岁钱!Top
27 楼solar(天哪,忘了我是什么时候注册的了!)(int argc, char *argv[])回复于 2002-02-01 15:13:49 得分 0
这样也行:
#include <iostream>
using namespace std;
class CA;
class CB;
class CA
{
public:
CB* m_pb;
};
class CB
{
public:
CA m_a;
};
int main(int argc,char *argv[])
{
CA a;
CB b;
a.m_pb = &b;
b.m_a = a;
return 0;
}
Top
28 楼gpmn(冷血动物)回复于 2002-02-01 15:23:28 得分 0
找到问题了,fk!
我的类定义的最后没加";"气!!!!!!
刚刚考研完,4、5个月没摸过vc了,大家别笑!
搞定了真爽!
Top
29 楼liuyang_cn(爱我吧)回复于 2002-02-01 15:27:28 得分 0
如果要在一个文件里实现,第一的类中队第二个类的引用必须用指针.如:
class B
{
A* a:
}
和/或
class A
{
B *b;
}
应为类在分配空间时必须知道大小.Top




