我已阅读了很多关于此问题的帖子,并按照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 ++课程中,我们没有得到指针和更大的项目,而且从我读到的内容来看,我真的感觉好像我理解了应该在这里发生什么,但我不知道为什么它不起作用。
感谢您的帮助。你会整个周末。
答案 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();
}