已经声明和定义Building类了,但运行到 build = new Building; 和 cout << build->settingroom << endl; 时会报使用未定义类型,但把Building类放在Person类前就没错误了。
#include<iostream>
#include<string>
using namespace std;
class Building;
class Person
{
public:
Building *build;
Person()
{
build = new Building;
}
void visit()
{
cout << build->settingroom << endl;
}
};
class Building
{
public:
Building()
{
settingroom = "客厅";
bedroom = "卧室";
}
string settingroom;
private:
string bedroom;
};
int main(void)
{
Person b;
b.visit();
system("pause");
return 0;
}
class Building;
只是声明,你应该把Building
类的定义放到Person
类前面。
声明只是说它时一个类,此时它的类型仍然是不完整的,因为它的大小仍然不知道,动态创建的时候就不知道分配多大内存。
前置声明,不知道类的完整定义
前置声明可以使用指针
你直接这样在Person类中申明Building 指针Building *build; 这样会产生一个严重的问题,假如你的Person类并没有被实例化,而你恰好把 build = new Building放在了Persion的构造方法中,就会导致在动态加载时不不能判断build为完整的类定义,所以这样写是不对的
都在头文件里面声明类,函数都用指针做参数就可以了。
难就别放啊,代码能够运行就行了,何必讲究位置
楼主这情况有两种解决思路的 1.学会用.h头文件分别定义.cpp复制实现 2.既然Building放前面后面都有未定义的,可以在Building前声明Person ,在Person声明Building这样就不报错了
把Buildingbuild放在Person的构造函数里面,要不放里面的话在你创建Person类的对象时会先进行构造函数里成员的初始化,而你将Buildingbuild放在Person的构造函数外面的话Person构造函数里的build就会是未声明的变量
楼主想搞清楚为什么
这个只是类的调用顺序的问题,和你的结果是一致的
把定义Building的代码放到Person前面。