社区
C语言
帖子详情
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
打赏
收藏
C++问题:请问对象之间是否可以互相引用?
C++问题:请问对象之间是否可以互相引用? 比如两个类,我希望A中有B的指针,B中有A的指针,请问这样的要求是否允许实现,怎么实现? 以下代码在VC中未能通过编译。 class B; class A { B m_b; } class B { A m_A; }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
布鲁克零三四四
2002-04-24
打赏
举报
回复
谢谢各位,在大家的帮助下,我的问题已经说理解决了。
我再补充一下吧,
我发现在使用申明的方式中(VC中肯定是这样)
A *pa;
与
A* pa;
是有区别的,在这种互相引用的代码中表现的很明显
再次谢谢大家。
bequickly
2002-04-18
打赏
举报
回复
类和其对象是两个概念
静态的类的描述是不能表现出对象在生存期间的动态关系的
lsaturn
2002-04-17
打赏
举报
回复
长见识
我原来以为声明就可以了。
Kingchen
2002-04-17
打赏
举报
回复
调用指针嘛,当然要用到指针符了。
std::coding::peasant
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;
};
C++类
互相
引用
C++中经常会遇到一个
问题
:两个类
之间
互相
用到对方。
问题
: 这种是不是一个好的设计? 如果不是一种好的设计,有什么办法规避? 如果没办法规避,代码应该如何写来避免出现各种编译或运行
问题
? 参考: ...
C++:不同类
对象
之间
访问数据的3种简单常用方法
C++编程中经常出现两个不同的类
对象
之间
相互访问数据的需要,但是成员变量不是public形式,无法直接访问相应的变量,抛开全局变量不谈,常用的方法有:1类封装留下的接口函数、2友元机制、3类静态成员变量。...
C/C++编程:std::thread 详解
上一篇博客《C++11 并发指南一(C++11 多线程初探)》中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用法。 std::thread 在 <thread>头文件中声明,因此...
C++两个类
互相
引用
的做法
但在处理相对复杂的
问题
、考虑类的组合时,很可能遇到俩个类相互
引用
的情况,这种情况称为循环依赖。 例如: class A { public: void f(B b);//以B类
对象
b为形参的成员函数 //这里编译错位,因为'B'为为止符号 }; ...
C++:头文件递归包含
问题
(
互相
包含
问题
)
在写C++项目中,碰到一个非常古怪的
问题
,当我像往常一样引入一个头文件时,vscode居然给我报红了(我在vscode中使用的是clangd插件): 当时就觉得非常震惊,我从未没碰到过只是include一个头文件,居然会报错的...
C语言
69,379
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章