----———>菜鸟问简单问题~~~送分啦
有两个类A 和B 。
在A中要使用B实例,并把自己的指针传给b,方便b访问A中的成员变量
//在A类中-----------------
Class A
{
Public:
int m_x;
void xx();
}
void A::xx()
{
B b;
b.m_p(this);
}
//在类B中----------------------
Class B
{
public:
A * m_p;
void yy();
}
void B::yy()
{
int y = m_p->m_x;
}
现在因为两者要相互访问,变成要相互包含头文件,编译通不过,丢失存储类型
要实现这样的访问要怎么办呢?55555~~~
问题点数:100、回复次数:20Top
1 楼sungengyu(快乐机器)回复于 2006-07-03 17:09:33 得分 20
A 用到 B 的实例,B 只用到 A 的指针。
把 B 放到 A 前面,然后在 B 前面声明 A 。
是声明,不是定义 :extern class A ;
像这样:
// 声明 A
extern class A ;
// 这里是 B 的定义
class B
{
// 以下省略
// 这里是A的定义
class A
// 以下省略Top
2 楼wanderfox()回复于 2006-07-03 17:16:49 得分 20
class B;//这样?
Class A
{
Public:
int m_x;
void xx();
}
void A::xx()
{
B b;
b.m_p(this);
}
//在类B中----------------------
Class B
{
public:
A * m_p;
void yy();
}
void B::yy()
{
int y = m_p->m_x;
}
Top
3 楼lizhanghui(拔刀术)回复于 2006-07-03 17:18:45 得分 0
这样是要把两个类放在同一个文件里么???
不行呀,vc生成的是分别在四个文件里的A.h B.h A.cpp B.cpp
而且我也不想放在一个文件里
怎么办呢/???谢谢~~Top
4 楼wanderfox()回复于 2006-07-03 17:44:35 得分 0
可以是4个文件
在A.h B.h的最前面加上
#ifndef _DEBUG_A //A.h中
(#ifndef_DEBUG_B)//B.h中
#define _DEBUG_A
(#define _DEBUG_B)
最后面加上
#endif
就行了Top
5 楼wanderfox()回复于 2006-07-03 17:46:00 得分 0
可以是4个文件
在A.h B.h的最前面加上
#ifndef _DEBUG_A //A.h中
(#ifndef_DEBUG_B)//B.h中
#define _DEBUG_A
(#define _DEBUG_B)
最后面加上
#endif
就行了Top
6 楼lizhanghui(拔刀术)回复于 2006-07-03 17:58:29 得分 0
to wanderfox()
看不懂诶~~~~~~~~~
Top
7 楼qhfu(改个名字)回复于 2006-07-03 18:13:55 得分 20
Class B
{
public:
A * m_p;
void yy();
}
void B::yy()
{
int y = m_p->m_x;
}
===>
class A;
Class B
{
public:
A * m_p;
void yy();
};
void B::yy()
{
int y = m_p->m_x;
}
=====================
Class A
{
Public:
int m_x;
void xx();
};
void A::xx()
{
B b;
b.m_p(this);
}
===>
#include "B.h"
Class A
{
Public:
int m_x;
void xx();
};
void A::xx()
{
B b;
b.m_p(this);
}
假设A B 分别放在A.h B.h 中
Top
8 楼diandian82(点点(nothing))回复于 2006-07-03 18:38:04 得分 10
前向引用Top
9 楼lizhanghui(拔刀术)回复于 2006-07-03 19:05:32 得分 0
恩~~~~
按照这个方法做了。
不过没通过编译。
报错:
B.cpp
B.cpp(101) : error C2027: use of undefined type 'A'
B.h(1) : see declaration of 'A'
B.cpp(101) : error C2227: left of '->m_x' must point to class/struct/union
双击后指向void B::yy()
{
int y = m_p->m_x;
}
中的int y = m_p->m_x; 这行。
将这行改成 A * temp = m_p; 可以通过编译。
为什么不能使用m_x变量呢???555~
是不是传递指针时传的是this指针所以不能访问???
为什么啊~~~
请指点
m(_ _)m 诚恳~~
一定加分Top
10 楼qhfu(改个名字)回复于 2006-07-03 22:26:01 得分 10
双击后指向void B::yy()
{
int y = m_p->m_x;
}
中的int y = m_p->m_x; 这行。
将这行改成 A * temp = m_p; 可以通过编译。
========
把这些定义放在 .cpp 中,然后#include 两个头文件Top
11 楼avril1986swj(哈密瓜)回复于 2006-07-03 22:29:00 得分 5
学习……Top
12 楼lizhanghui(拔刀术)回复于 2006-07-04 10:18:52 得分 0
to qhfu(崩贵)
应该不是这个原因,我是用vc的,类实现本来就是放在各自的.cpp文件里
在B.cpp中本来包含着B.h的
如果加上#include "A.h"
编译后报错:error C2039: 'm_nXy' : is not a member of 'CStation'
指向int y = m_p->m_x;
大家可以试试
哪位大哥帮调调
是不是前想引用申明本来就无法调用其成员???
http://dev.wl668.com/c/c++/200510195604_4303066.shtml
这个地方的问题和我很像
他一样不可以使用前向引用声明的类的成员变量和成员函数
Top
13 楼lizhanghui(拔刀术)回复于 2006-07-04 10:24:05 得分 0
哦,对不起,包含了#include "A.h" 后好象可以了,呵呵
实在不好意思
不过这样的话不是变成AB类相互包含了么Top
14 楼lizhanghui(拔刀术)回复于 2006-07-04 10:31:36 得分 0
看来单纯的前向引用只是让B类对 A类的指针定义通过,
然后还得在调用前加A类的头文件包含#include "A.h"
这样才可以使用它的成员
不知道为什么
不过问题解决了,呵呵~~
如果没什么补充一小时后揭贴
分加到100,顶着有分Top
15 楼al0n9(终于有四条内裤了)回复于 2006-07-04 10:53:56 得分 0
void A::xx()
{
B b;
b.m_p(this);
}
b.m_p(this)这种用法我在VS2005下面编译有错误。Top
16 楼al0n9(终于有四条内裤了)回复于 2006-07-04 10:56:20 得分 5
哦,对不起,包含了#include "A.h" 后好象可以了,呵呵
实在不好意思
不过这样的话不是变成AB类相互包含了么
=========================
不是相互包含。只是在A类的xx()函数里,有一个B类的局部对象而已。这跟在A类的定义中就包含一个B类的对象是完全不同的。
Top
17 楼lizhanghui(拔刀术)回复于 2006-07-04 11:12:34 得分 0
to: al0n9(al0n9)
呵呵,不好意思,笔误
改成
void A::xx()
{
B b;
b.m_p = this;
};
Top
18 楼lizhanghui(拔刀术)回复于 2006-07-04 11:21:29 得分 0
现在是在A.h里#include "B.h"
B.h里class A;
B.cpp里#inclued "A.h"
只有这样才行,如果把 #inclued "A.h" 移到 B.h里就不行的
不管怎么样,总算行了,哈哈~~
再次感谢 m(_ _)m
Top
19 楼qhfu(改个名字)回复于 2006-07-04 12:51:48 得分 10
如果把#include "A.h"放在 B.h中,又把#include "B.h"放在 A.h中,那岂不是递归包含,所以只能一个用#include 一个用前置,或者两个都前置,前置的要求是,.h中不应该有对象声明 ,只能有指针声明,然后把定义放入cpp中,在cpp中包含这些头文件。Top
20 楼lizhanghui(拔刀术)回复于 2006-07-04 12:55:15 得分 0
怎么给不了分?????
说什么“贴子回复次数大于跟给分次数”
不懂弄了Top




