散分了,散分了

u013163178 2014-10-15 12:52:17
今天在看《C++ primer e5》的时候,看到地250页的练习题。
练习7.3.3:定义一对类X和Y,其中X包含一个指向Y的指针,而Y包含一个类型为X的对象。

我是这么定义的,完了之后我就觉得是不是有矛盾啊,这个编译器怎么编译啊,编译其中任何一个都会出现为声明类型啊,构造顺序也有矛盾啊。
class X
{
private:
Y *a;
};
class Y
{
private:
X b;
};

我是C++新手,希望懂的人能为我揭开开迷雾,醍醐灌顶。
...全文
181 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2014-10-16
  • 打赏
  • 举报
回复
引用 10 楼 u013163178 的回复:
引用 6 楼 ri_aje 的回复:
指针只需要声明,对象才需要定义,所以把 Y 的声明放在 X 前面就可以破循环引用的问题了。
请问构造顺序是怎么样子的呢
对象构造顺序有具体代码决定,你得给出代码,别人才能回答构造顺序的问题。
铖邑 2014-10-15
  • 打赏
  • 举报
回复
先声明 class Y; class X { private: Y *a; }; class Y { private: X b; }; 这样就可以了
wenrenhua08 2014-10-15
  • 打赏
  • 举报
回复
引用 3 楼 lovesmiles 的回复:
先声明 class Y 就可以使有Y了 再定义class Y{} 就像先声明函数 void func(); 就可以使用函数func了 然后再定义函数 void func(){} 一样的道理
+++
sctianhu 2014-10-15
  • 打赏
  • 举报
回复
引用 10 楼 u013163178 的回复:
引用 6 楼 ri_aje 的回复:
指针只需要声明,对象才需要定义,所以把 Y 的声明放在 X 前面就可以破循环引用的问题了。
请问构造顺序是怎么样子的呢
class X { private: Y *a; //定义指针,没有做new也不调X的构造;可看做是定义一个整型吧; }; class Y { private: X b; //这个是会初始化b的,会调X的构造函数; }; 所以,初始的顺序是: X对象,只调X构造函数,Y会调用X,再调Y的构造函数。
勤奋的小游侠 2014-10-15
  • 打赏
  • 举报
回复
引用 9 楼 u013163178 的回复:
[quote=引用 3 楼 lovesmiles 的回复:] 先声明 class Y 就可以使有Y了 再定义class Y{} 就像先声明函数 void func(); 就可以使用函数func了 然后再定义函数 void func(){} 一样的道理
那请问构造的时候,先构造那个呢[/quote] 你这个代码只是声明,并没有定义一个具体的对像,不会有对像被构造出来。 等你用到他们时,那个对像先被定义就先被构造。 像你的代码,都只是声明而已。
ybin225 2014-10-15
  • 打赏
  • 举报
回复
class Y; class X{ private: Y *p; }; class Y{ private: X b; };
「已注销」 2014-10-15
  • 打赏
  • 举报
回复
引用 6 楼 ri_aje 的回复:
指针只需要声明,对象才需要定义,所以把 Y 的声明放在 X 前面就可以破循环引用的问题了。
请问构造顺序是怎么样子的呢
「已注销」 2014-10-15
  • 打赏
  • 举报
回复
引用 3 楼 lovesmiles 的回复:
先声明 class Y 就可以使有Y了 再定义class Y{} 就像先声明函数 void func(); 就可以使用函数func了 然后再定义函数 void func(){} 一样的道理
那请问构造的时候,先构造那个呢
女神打Boss 2014-10-15
  • 打赏
  • 举报
回复
版主大哥 2014-10-15
  • 打赏
  • 举报
回复
ri_aje 2014-10-15
  • 打赏
  • 举报
回复
指针只需要声明,对象才需要定义,所以把 Y 的声明放在 X 前面就可以破循环引用的问题了。
Uron 2014-10-15
  • 打赏
  • 举报
回复
引用 4 楼 hjl0508 的回复:
[quote=引用 1 楼 xpdavis 的回复:] 先声明 class Y; class X { private: Y *a; }; class Y { private: X b; }; 这样就可以了
+++[/quote] ++++
hjl0508 2014-10-15
  • 打赏
  • 举报
回复
引用 1 楼 xpdavis 的回复:
先声明 class Y; class X { private: Y *a; }; class Y { private: X b; }; 这样就可以了
+++
勤奋的小游侠 2014-10-15
  • 打赏
  • 举报
回复
先声明 class Y 就可以使有Y了 再定义class Y{} 就像先声明函数 void func(); 就可以使用函数func了 然后再定义函数 void func(){} 一样的道理
modyaj 2014-10-15
  • 打赏
  • 举报
回复
像楼上一样 先做个申明!!

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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