前向声明,嵌入式类和两个.hpp相互包含:如何使用?

时间:2016-01-11 21:14:15

标签: c++ forward-declaration

当我编译以下内容时,我得到了error: unknown type name 'ClassA'; did you mean 'ClassB'?

我猜我的编译器需要知道 ClassA 才能知道 ClassB ,但它还需要知道 ClassB 才能知道 ClassA的

所以我尝试了转发声明(如建议的here)。

例如,我在 ClassA.hpp 中的class ClassA;之前声明了#include "ClassB.hpp"。它工作得很好!

但是如果我的类使用嵌入式类声明,如下所示,仍然存在错误:

 error: incomplete type 'ClassA' named in nested name specifier
class   ClassA::ClassC;
        ^~~~~~~~

在这种情况下,我尝试在ClassC中声明ClassA,在ClassA::ClassC中使用ClassB并在class ClassA::ClassC;之前添加#include "ClassB.h" ClassA.h (其中一些行已注释)。 但它并没有完成这项工作。

我的档案:

我有5个文件:

  • ClassA.hpp
  • ClassA.cpp
  • ClassB.hpp
  • ClassB.cpp
  • 的main.cpp

ClassA ClassB 分别包含class ClassAclass ClassA声明。

他们都互相包容。

main.cpp 包括 ClassA.hpp ClassB.hpp

以下是我的文件内容:

ClassA.hpp:

#ifndef CLASSA_HPP
# define CLASSA_HPP

class    ClassA;
//class    ClassA::ClassC;      //<----- This doesn't work.
# include "ClassB.hpp"

class   ClassA{
public:
    // [...]
    void        printb(ClassB const & b) const;

    //class    ClassC{
    //};

private:
    // [...]
};

#endif

ClassA.cpp:

#include "ClassA.hpp"

void            printb(ClassB const & b) const{
    // [...]
}

ClassB.hpp:

#ifndef CLASSB_HPP
# define CLASSB_HPP

class    ClassB;
# include "ClassA.hpp"

class   ClassB{
public:
    // [...]
    void        printa(ClassA const & a) const;
    // ClassA::ClassC &    returnC(ClassA::ClassC elem);
private:
    // [...]
};

#endif

ClassB.cpp:

#include "ClassB.hpp"

void            printa(ClassA const & a) const{
    // [...]
}

main.cpp:

#include "ClassA.hpp"
#include "ClassB.hpp"

int     main(void){
    ClassA      a = ClassA();
    ClassB      b = ClassB();

    a.printb(b);
    b.printa(a);
    return 0;
}

我的问题:

在这种情况下,使用前向声明适用于简单类。但它看起来像是一种解决方法,使用嵌入式类变得有点复杂,我真的不知道如何处理它。

所以:

  • 有没有更好的方法(比前向声明)做这些事情?
  • 如果没有,如何使用这样的嵌入式类的前向声明来做到这一点?我该怎么办而不是前方声明class ClassA::ClassC

0 个答案:

没有答案