c++中如果有两个类A,B。A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量,可以吗?
本来是java上的两个类,想将它们做成c++的,别的方面都还可以,就是出现这个问题,好像不认识其中一个类。该怎么办,谢谢 问题点数:20、回复次数:22Top
1 楼abblly(西边日出东边雨)回复于 2006-12-14 16:03:55 得分 0
A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量
------------
改成指针
A定义时有一个B的指针作为成员变量,而B定义时有一个A的指针作为成员变量
Top
2 楼bobseadream(bobo)回复于 2006-12-14 16:15:26 得分 0
需要改成指针,否则会导致类之间的循环依赖
Top
3 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-12-14 16:18:33 得分 0
改成指针,java上本来就是指针。Top
4 楼oldliu(老刘)回复于 2006-12-14 16:25:22 得分 0
哪个类在前面,其包含的另一个类实例改为指针,这样就可以了,编译的时候它是指针编译器就知道可以到后面找它指向的类的定义了。。。Top
5 楼alice1982()回复于 2006-12-14 16:51:32 得分 0
那如果还有函数的返回类型,参数也是这样呢Top
6 楼xb_feng()回复于 2006-12-14 17:15:15 得分 0
class A;
class B
{
...
A* a_of_b;
...
};
class A
{
...
B* b_of_a;
...
};Top
7 楼alice1982()回复于 2006-12-14 17:40:25 得分 0
class B;
基本上是这样
class A
{
B* b;
public:
A(B* b);
B* hanshu();
void hanshu2(B* b);
}
class B
{
A* a;
public:
B(A* a);
A * hanshu3();
void hanshu4(A * *a);
}
编译时出错:missing ';' before '*'
missing storage-class or type specifiers
identifier 'A'
identifier 'B'
unexpected 'class A('
unexpected token(s) preceding ';'
unexpected 'class B('
unexpected token(s) preceding ';'Top
8 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 17:51:01 得分 0
唉,类结束要用";"
class B;
class A
{
B* b;
public:
A(B* b);
B* hanshu();
void hanshu2(B* b);
};
class B
{
A* a;
public:
B(A* a);
A * hanshu3();
void hanshu4(A * *a);
};Top
9 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 17:53:57 得分 0
那如果还有函数的返回类型,参数也是这样呢
---------------------
不是,返回类型可以是指针、引用,也可以直接是类A或B
函数参数类型只能在定义后使用,因此得是指针或引用。
成员变量也只能是指针或引用。
Top
10 楼alice1982()回复于 2006-12-14 17:59:18 得分 0
to
lann64(昆仑大鹏@迦楼罗)
呵呵,忘了那个“;”,只是我用vc,那两个类分别有.h文件
说说关键的啊,为什么出错呢,我按照大家说的试过了啊
拜托Top
11 楼OOPhaisky(异化$渴望成功~~)回复于 2006-12-14 18:28:46 得分 0
c++中如果有两个类A,B。A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量,可以吗?
------------------------------------------------------------------------------------
不可以,只能将一个改成指针。
你的程序写错了,少了两个分号,如下:
class B;
class A
{
B* b;
public:
A(B* b);
B* hanshu();
void hanshu2(B* b);
};//此处少了一个分号
class B
{
A* a;
public:
B(A* a);
A * hanshu3();
void hanshu4(A * *a);
};//此处少了一个分号
Top
12 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 18:37:49 得分 0
说说关键的啊,为什么出错呢,我按照大家说的试过了啊
----------------
没什么其他关键的了,换成指针,加上分号,编译没错了。Top
13 楼missilery(导弹专家)回复于 2006-12-14 19:44:16 得分 0
还是从设计的角度考虑吧
这不是循环依赖了么?Top
14 楼alice1982()回复于 2006-12-14 20:51:45 得分 0
确实按照大家说的有分号,把那几条语句写在一个cpp文件里编译可以通过。
可是我只是简写了那个类,他们分别有自己的头文件和cpp文件,我通过# include 来声明这些类的。这样的情况下就是出现刚才那些错误。怎么办呢?Top
15 楼studyall123(不想当将军的士兵不是一名好士兵)回复于 2006-12-14 23:00:14 得分 0
markTop
16 楼lann64(昆仑大鹏@迦楼罗)回复于 2006-12-14 23:12:06 得分 0
不知道你怎么写的头文件和cpp文件。Top
17 楼alice1982()回复于 2006-12-15 09:57:59 得分 0
#if !defined(AFX_A_H__1594558E_B0D1_4D64_84F0_E6F5C9723961__INCLUDED_)
#define AFX_A_H__1594558E_B0D1_4D64_84F0_E6F5C9723961__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "B.h"
class A
{
public:
B *b;
int yposition;
public:
A();
virtual ~A();
A(int ypos);
void setvanishingpoint(B *b1);
B* getvanishingpoint();
void setbest(B* b2);
};
#endif // !defined(AFX_A_H__1594558E_B0D1_4D64_84F0_E6F5C9723961__INCLUDED_)
#if !defined(AFX_B_H__EC75EC99_DBE8_4FDE_AC83_4277ED27920A__INCLUDED_)
#define AFX_B_H__EC75EC99_DBE8_4FDE_AC83_4277ED27920A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "A.h"
class B
{
public:
A *a;
int xposition;
B();
virtual ~B();
B(int ypos);
void setvanishingpoint(A *a1);
A* getvanishingpoint();
void setbest(A* a2);
};
#endif // !defined(AFX_B_H__EC75EC99_DBE8_4FDE_AC83_4277ED27920A__INCLUDED_)
A::A()
{
}
A::~A()
{
}
A::A(int ypos)
{
yposition=ypos;
b=NULL;
}
void A::setvanishingpoint(B *b1)
{
b=b1;
}
B* A::getvanishingpoint()
{
return b;
}
void A::setbest(B* b2)
{
yposition=b2->xposition;
}
B::B()
{
}
B::~B()
{
}
B::B(int xpos)
{
xposition=xpos;
a=NULL;
}
void B::setvanishingpoint(A *a1)
{
a=a1;
}
A* B::getvanishingpoint()
{
return a;
}
void B::setbest(A* a2)
{
xposition=a2->yposition;
}
先不要管这两个类的相似性(函数什么的都一样),就是那个意思,如果它能通过了,我的那些完整的类也应该可以吧
A.cpp
e:\练习\tiwen\b.h(17) : error C2143: syntax error : missing ';' before '*'
e:\练习\tiwen\b.h(17) : error C2501: 'A' : missing storage-class or type specifiers
e:\练习\tiwen\b.h(17) : error C2501: 'a' : missing storage-class or type specifiers
e:\练习\tiwen\b.h(22) : error C2061: syntax error : identifier 'A'
e:\练习\tiwen\b.h(23) : error C2143: syntax error : missing ';' before '*'
e:\练习\tiwen\b.h(23) : error C2501: 'A' : missing storage-class or type specifiers
e:\练习\tiwen\b.h(23) : error C2501: 'getvanishingpoint' : missing storage-class or type specifiers
e:\练习\tiwen\b.h(24) : error C2061: syntax error : identifier 'A'
B.cpp
e:\练习\tiwen\a.h(15) : error C2143: syntax error : missing ';' before '*'
e:\练习\tiwen\a.h(15) : error C2501: 'B' : missing storage-class or type specifiers
e:\练习\tiwen\a.h(15) : error C2501: 'b' : missing storage-class or type specifiers
e:\练习\tiwen\a.h(21) : error C2061: syntax error : identifier 'B'
e:\练习\tiwen\a.h(22) : error C2143: syntax error : missing ';' before '*'
e:\练习\tiwen\a.h(22) : error C2501: 'B' : missing storage-class or type specifiers
e:\练习\tiwen\a.h(22) : error C2501: 'getvanishingpoint' : missing storage-class or type specifiers
e:\练习\tiwen\a.h(23) : error C2061: syntax error : identifier 'B'
Generating Code...
Error executing cl.exe.
Top
18 楼boys2008nian(飞雪)回复于 2006-12-15 11:48:38 得分 0
c++中如果有两个类A,B。A定义时有一个B的对象作为成员变量,而B定义时有一个A的对象作为成员变量,可以吗?
------------------------------------------------------------------------------------
不可以,只能将一个改成指针或者引用
因为
这个类还没有定义
你只知道类型,不能申请类对象空间
所以就更不能第一类对象了Top
19 楼dadi0189(冰雨)回复于 2006-12-15 12:16:07 得分 0
对用到的类进行声明,然后用指针或引用去定议成员变量.Top
20 楼zengkun100(夜的孩子)回复于 2006-12-15 15:16:00 得分 0
循环依赖!
而且要定义成员变量,就必须知道对象的大小,所以在类的完整定义出现以前是没有办法定义对象的,因为不知道应该分配多少内寸,所以上面说的指针是正解。Top
21 楼H_Bai(小白)回复于 2006-12-15 15:29:40 得分 0
改成指针,java上本来就是指针。
JAVA还用指针???
C++里面用指针还可以,JAVA用要出错
Top
22 楼xu_yuanjie()回复于 2006-12-15 16:53:48 得分 0
markTop




