C++问题:请问对象之间是否可以互相引用?

布鲁克零三四四 2002-04-17 07:30:10

C++问题:请问对象之间是否可以互相引用?
比如两个类,我希望A中有B的指针,B中有A的指针,请问这样的要求是否允许实现,怎么实现?

以下代码在VC中未能通过编译。

class B;
class A
{
B m_b;
}
class B
{
A m_A;
}
...全文
102 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢各位,在大家的帮助下,我的问题已经说理解决了。

我再补充一下吧,
我发现在使用申明的方式中(VC中肯定是这样)

A *pa;

A* pa;
是有区别的,在这种互相引用的代码中表现的很明显
再次谢谢大家。
bequickly 2002-04-18
  • 打赏
  • 举报
回复
类和其对象是两个概念
静态的类的描述是不能表现出对象在生存期间的动态关系的
lsaturn 2002-04-17
  • 打赏
  • 举报
回复
长见识
我原来以为声明就可以了。
Kingchen 2002-04-17
  • 打赏
  • 举报
回复
调用指针嘛,当然要用到指针符了。
  • 打赏
  • 举报
回复
据我理解:

class B;
class A
{
B m_b;
}
class B
{
A m_A;
}

无法分配内存,A是鸡,B是蛋,到底是鸡大还是蛋大?
m_b占用的内存和B类的内存相同
m_A占用的内存和A类的内存相同
那么他们的构造函数放到哪里去了?

sizeof(A)=sizeof(B)+sizeof(A构造)
sizeof(B)=sizeof(A)+sizeof(B构造)
此方程无解

class B;
class A
{
B *m_b;
}
class B
{
A *m_A;
}

就可以了,m_b和m_A只是一个地址,在VC里面是DWORD,占4个字节,如果用new分配内存,
m_b和m_A的内存分配到新的地址空间了,没有谁包含谁的管理了。
LionEagle 2002-04-17
  • 打赏
  • 举报
回复
class B;
class A
{
B m_b;
};
class B
{
A m_A;
};

之所以不通过是因为C++编译器不进行全局的优化,它要求在用一个类型来定义变量之前该类型必须已经定义过了,之所以要这样是因为不知道类型定义的话,编译器无法为变量分配内存

在B m_b;之前,只有class B;,这只是一个声明而不是定义,所以会报错

而改为B* m_b;或B& m_b;能通过是因为B* m_b是指针,编译器总可以为指针分配内存,它只要知道指针是指向什么类型即可,所以只要有声明就可以了。对于引用,它在实现时和指针差不多,因而也只需要声明即可。

如果C++编译器能全局优化的话,以下代码也可以通过,因为信息足够为变量分配内存,不过因为C++编译器没有全局性,所以实际上不能通过

class A
{
B m_b; // 只要编译器向后找就可以找到class B的定义
}
class B
{
A* m_A;
}

所以要使用者来避免这样的情况,做法也很简单,将class A与class B定义颠倒,再再class B前面加上 A的声明即可,即

class A;
class B
{
A* m_A;
};
class A
{
B m_b; // 这里可以不定义为指针,因为前面有A的定义,如果前面只有
// A的声明的话,就要定义为指针(或引用)
};



bequickly 2002-04-17
  • 打赏
  • 举报
回复
HOHO 偶快了那么一点点 ^_^
bequickly 2002-04-17
  • 打赏
  • 举报
回复
class B;
class A
{
B* m_b;
};
class B
{
A* m_A;
};

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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