C++使用未定义类型

已经声明和定义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前面。