包括和转发声明C++



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

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

啊:

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

答.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

乙.cpp:

#include "B.h"
void B::useA() const
{
    aInstance.myMethod();
}

主.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++课上,我们没有看到指针和更大的项目,从我读到的内容来看,我真的觉得我明白这里应该发生什么,但我不知道为什么它不起作用。

感谢您的任何帮助。你会让我度过整个周末。

它是

aInstance->myMethod();

aInstance.myMethod();

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

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

编辑:

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

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

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 的成员函数。

首先,您需要实例化对象

const A* aInstance;

然后更改代码

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

最新更新