不同头文件的两个类可以互相调用其对象么?

yrisxfyh 2009-08-13 09:15:04

/////////////////////////////
// table.h 头文件
/////////////////////////////
#pragma once

#include "desk.h"

#include <iostream>
using namespace std;

class table
{
public:
table()
{
cout << "table 的构造函数" << endl;
}

protected:
desk ds;
};


/////////////////////////////
// desk.h 头文件
/////////////////////////////
#pragma once

#include "table.h"

#include <iostream>
using namespace std;

class desk
{
public:
desk()
{
cout << "desk 的构造函数" << endl;
}
protected:
// table tb;
};




/////////////////////////////
// main.cpp 主函数文件
/////////////////////////////
#include "table.h"
#include "desk.h"

#include <iostream>
using namespace std;


int main()
{
table tab;

cout << endl;
system("pause");
return 0;
}



请教各位:
在 table中可以定义 desk类对象,为什么在 desk类中,却不能定义 table类对象呢?????????
...全文
387 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Synpeace 2009-08-13
  • 打赏
  • 举报
回复
解决办法:

/////////////////////////////
// table.h 头文件
/////////////////////////////
#pragma once

class table; // 加入这句

#include "desk.h"

/////////////////////////////
// desk.h 头文件
/////////////////////////////
#pragma once

class desk; // 再加入这句。两句都要加上

#include "table.h"
buptzwp 2009-08-13
  • 打赏
  • 举报
回复
用对象指针吧。
lwlchristy 2009-08-13
  • 打赏
  • 举报
回复
相互依赖的类不能相互包含的,书里写的很清楚了!
yrisxfyh 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yang_e_2009 的回复:]
引用楼主 yrisxfyh 的回复:
C/C++ code///////////////////////////////    table.h 头文件/////////////////////////////#pragma once

#include"desk.h"

#include <iostream>usingnamespace std;class table
{public:
    table()
    {
        cout < <"table 的构造函数" < < endl;
    }protected:
    desk ds;
};///////////////////////////////    desk.h 头文件/////////////////////////////#pragma once

#include"table.h"

#include <iostream>usingnamespace std;class desk
{public:
    desk()
    {
        cout < <"desk 的构造函数" < < endl;
    }protected://    table tb;};///////////////////////////////    main.cpp 主函数文件/////////////////////////////#include"table.h"
#include"desk.h"

#include <iostream>usingnamespace std;int main()
{
    table tab;

    cout < < endl;
    system("pause");return0;
}

请教各位:
      在 table中可以定义 desk类对象,为什么在 desk类中,却不能定义 table类对象呢?????????


因为头文件都#pragma once只包含一次

lz先include"table.h"
而table.h内部是先include"desk.h" 后才定义类table

这就使得类desk在类table之前定义
在desk中引用还未定义的table自然不行


[/Quote]

哦,有道理..
yrisxfyh 2009-08-13
  • 打赏
  • 举报
回复
恩,基本上明白了,
就是双方一直定义对方对象,然后构造,定义的对象又定义对象,构造,这样双方进入了一个无止尽的死循环..
谢谢各位的讲解
yang_e_2009 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 yrisxfyh 的回复:]
C/C++ code/////////////////////////////// table.h 头文件/////////////////////////////#pragma once

#include"desk.h"

#include<iostream>usingnamespace std;class table
{public:
table()
{
cout<<"table 的构造函数"<< endl;
}protected:
desk ds;
};/////////////////////////////// desk.h 头文件/////////////////////////////#pragma once

#include"table.h"

#include<iostream>usingnamespace std;class desk
{public:
desk()
{
cout<<"desk 的构造函数"<< endl;
}protected:// table tb;};/////////////////////////////// main.cpp 主函数文件/////////////////////////////#include"table.h"
#include"desk.h"

#include<iostream>usingnamespace std;int main()
{
table tab;

cout<< endl;
system("pause");return0;
}

请教各位:
      在 table中可以定义 desk类对象,为什么在 desk类中,却不能定义 table类对象呢?????????

[/Quote]
因为头文件都#pragma once只包含一次

lz先include"table.h"
而table.h内部是先include"desk.h" 后才定义类table

这就使得类desk在类table之前定义
在desk中引用还未定义的table自然不行

lori227 2009-08-13
  • 打赏
  • 举报
回复
table 里面又一个desk对象,, 构造desk的时候,又会构造table对象... 这样无穷的了.

成员声明为 table *ptable 和desk *pdesk 用指针来操作吧~
Vegertar 2009-08-13
  • 打赏
  • 举报
回复
先有鸡还是先有蛋的问题。两个类相互依赖,这里取决于 main 中头文件包含顺序,放弃这种想法。
lori227 2009-08-13
  • 打赏
  • 举报
回复
用指针吧~~ 否则无穷递归构造了...
xingzhe2001 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yrisxfyh 的回复:]
引用 1 楼 pengzhixi 的回复:
需要前置声明

不对吧,包含了头文件,就不是声明的问题了..
[/Quote]

前置声明是只声明不定义,比如在desk.h前不要#include "table.h"
应该写 class table;
piaomiaoju 2009-08-13
  • 打赏
  • 举报
回复
你这叫相互包含,不能解决定义的问题。可以通过友元类声明来解决。具体我也有点忘记了,mark
xingzhe2001 2009-08-13
  • 打赏
  • 举报
回复
不要交叉包含头文件。
yrisxfyh 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
需要前置声明
[/Quote]
不对吧,包含了头文件,就不是声明的问题了..
pengzhixi 2009-08-13
  • 打赏
  • 举报
回复
需要前置声明

64,647

社区成员

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

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