C ++前向声明和继承

时间:2012-07-03 15:52:44

标签: c++ inheritance visitor-pattern

我有这样的情况

A.H

#ifndef _CLASSA
#define _CLASSA
class B;

class A {
    virtual void addTo(B*) {}
};

#endif

B.h

#ifndef _CLASSB
#define _CLASSB

#include "A.h"

class B : public A {
    B();
    void addTo(B* b) {
         // blah blah blah
    }
};

#endif

B.cpp

#include "B.h"

B::B() : A() {}

的main.cpp

#include "B.h"

int main() {
    A* b = new B();
    B* d = new B();
    b->addTo(d);
}

项目无法编译。如果我在A头中转发声明B,编译器会抱怨B.h中的类的期望。如果我在A.h中包含B.h标头,则编译器无法解析基类。这可能吗?

1 个答案:

答案 0 :(得分:2)

是的,在A.h中添加B.h并在B中转发声明A.h

  

如果我在A标题中转发声明B,编译器会抱怨B.h中某个类的期望

现在你拥有代码的方式应该可行。但我怀疑你实际上在方法B中使用addTo,在这种情况下,前向声明是不够的。您需要将实现与实现文件分开,并在那里包含B

编辑:正如DeadMg所指出的,class B : class A {是无效的语法,您可能需要class B : Aclass B : public A