包括& C ++中的前向声明

时间:2012-03-23 10:50:11

标签: c++ include forward-declaration

我已阅读了很多关于此问题的帖子,并按照http://www.eventhelix.com/RealtimeMantra/HeaderFileIncludePatterns.htm的说明进行了操作,但我仍然遇到包含问题的问题。

为了确保我的实际代码中没有其他错误,我编写并尝试完全编译以下代码。

A.H:

#ifndef A_H
#define A_H
class A
{
public:
    A(){};
    void myMethod() const;
};
#endif

A.cpp:

#include "A.h"
#include <iostream>
void A::myMethod() const
{
    std::cout << "Hooray!" << std::endl;
}

B.h:

class A;

#ifndef B_H
#define B_H
class B
{
    const A* aInstance;
public:
    B(){};
    void useA() const;
};
#endif

B.cpp:

#include "B.h"

void B::useA() const
{
    aInstance.myMethod();
}

main.cpp中:

#include "A.h"
#include "B.h"

int main()
{
    B bInstance;
    bInstance.useA();
    return 0;
}

编译命令:g++ main.cpp A.cpp B.cpp

错误:

B.cpp: In member function ‘void B::useA() const’:
B.cpp:5:15: error: request for member ‘myMethod’ in ‘((const B*)this)->B::aInstance’, which is of non-class type ‘const A* const’

我真的开始感到沮丧。如何让B级使用A级?在我读的C ++课程中,我们没有得到指针和更大的项目,而且从我读到的内容来看,我真的感觉好像我理解了应该在这里发生什么,但我不知道为什么它不起作用。

感谢您的帮助。你会整个周末。

3 个答案:

答案 0 :(得分:3)

这是:

aInstance->myMethod();

aInstance.myMethod();

因为aInstance是指向A的指针,而不是A对象。

此外,在B.cpp中,您需要#include "A.h"

编辑:

您的代码会导致未定义的行为aInstance未初始化,您在其中调用myMethod。由于它不是virtual方法,并且您没有访问任何A的成员,它可能会起作用,但是,这是错误的。你应该在B的构造函数中初始化它:

B() : aInstance(new A) {};

答案 1 :(得分:1)

B.cpp还包括A.h

#include "A.h"  //include this as well
#include "B.h"

void B::useA() const
{
    aInstance->myMethod(); //also use -> not .
}
包含

A.h,以便编译器可以知道aInstance具有名为myMethod的成员函数。

答案 2 :(得分:0)

首先,您需要实例化对象

const A* aInstance;

然后更改代码

void B::useA() const
{
    aInstance->myMethod();
}