簡體   English   中英

C ++這是一個不完整的類型嗎?

[英]C++ How is this an 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();::class_a->DoSomething();編譯錯誤::class_a->DoSomething(); member access into incomplete type "ClassA" 但是,在解析ClassB的構造函數時,ClassA如何不完整? 通過ClassA時,它是否到達構造函數中的ClassB類型,然后希望轉到該文件?

這是一種不完整的類型,因為您沒有在ClassB標頭中包含ClassA標頭, 但您嘗試使用ClassA實例。 換句話說,由於前向聲明,編譯器知道有一個ClassA ,足以聲明一個指針,但是類型不完整,無法使用,因為編譯器沒有看到該類型的聲明。

您需要制作一個源文件(例如ClassB.cpp ),在源文件中包含ClassA標頭,然后將ClassB構造函數的實現移到源文件中。

讓我們從編譯處理完includes之后來看:

#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文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM