C ++这是一个不完整的类型?

时间:2016-06-07 22:16:57

标签: c++ incomplete-type

这是代码

#include <iostream>

#include "ClassA.h"

ClassA* class_a = new ClassA();

int main() {



    return 0;
}

A类

#ifndef CLASSA_H
#define CLASSA_H

#include <iostream>
#include "ClassB.h"

class ClassA
{
public:
    ClassA()
    {
        ClassB classB = new ClassB();

        std::cout << "End of constructor" << std::endl;
    }

    void ClassA::DoSomething( void )
    {
        std::cout << "ClassA  DoSomething";
    }
};


#endif  /* CLASSA_H */

B类

#ifndef CLASSB_H
#define CLASSB_H

class ClassA;

extern ClassA* class_a;

class ClassB
{

public:

    ClassB ()
    {
        ::class_a->DoSomething();
        std::cout << "ClassB constructor" << std::endl;
    }

};


#endif  /* CLASSB_H */

ClassB的构造函数中,我在::class_a->DoSomething();处遇到编译错误member access into incomplete type "ClassA"。但是当它解析ClassB的构造函数时,ClassA是如何不完整的?当它通过ClassA时,是否会在它的构造函数中找到类型ClassB,然后希望转到该文件?

2 个答案:

答案 0 :(得分:3)

这是一个不完整的类型,因为您没有在ClassA标题中添加ClassB的标题,但您尝试使用ClassA实例。换句话说,由于前向声明,编译器知道有一个ClassA,这足以声明一个指针,但是类型不完整而且无法使用,因为编译器没有看到类型的声明

您需要创建一个源文件(例如ClassB.cpp),在源文件中包含ClassA标头,并将ClassB构造函数的实现移动到源文件。

答案 1 :(得分:0)

让我们从处理了包含的编译点开始看这个:

#line 1 main.cpp
//#include <iostream>
/* Text of iostream inserted here */
//#include "ClassA.h"
#line 1 ClassA.h

//#ifndef CLASSA_H (it isn't defined)
#define CLASSA_H

//#include <iostream>
/* Almost nothing here because iostream has already been included */

//#include "ClassB.h"
#line 1 ClassB.h
//#ifndef CLASSB_H (again, it isn't defined)
#define CLASSB_H

class ClassA;

extern ClassA* class_a;

class ClassB
{

public:

    ClassB ()
    {
        ::class_a->DoSomething();

右。所以我们编译了main.cpp,其中包括ClassA.h,其中包括ClassB.h。在我们到达此处时,ClassA未定义。

将(至少)一个构造函数移动到一个单独的.cpp文件中。