在处理包括彼此在内的多个类时出现此错误:
error: expected class-name before '{' token
我知道发生了什么,但我不知道如何正确纠正它。这是代码的抽象版本:
啊
#ifndef A_H_
#define A_H_
#include "K.h"
class A
{
public:
A();
};
#endif /*A_H_*/
A.cpp
#include "A.h"
A::A() {}
溴化氢
#ifndef B_H_
#define B_H_
#include "A.h"
class B : public A
{ // error: expected class-name before '{' token
public:
B();
};
#endif /*B_H_*/
B.cpp
#include "B.h"
B::B() : A() {}
Jh
#ifndef J_H_
#define J_H_
#include "B.h"
class J
{
public:
J();
};
#endif /*J_H_*/
J.cpp
#include "J.h"
J::J() {}
克
#ifndef K_H_
#define K_H_
#include "J.h"
class K : public J
{ // error: expected class-name before '{' token
public:
K();
};
#endif /*K_H_*/
K.cpp
#include "K.h"
K::K() : J() {}
主文件
#include "A.h"
int main()
{
return 0;
}
从main.cpp开始,我可以确定这是编译器看到的:
#include "A.h"
#ifndef A_H_
#define A_H_
#include "K.h"
#ifndef K_H_
#define K_H_
#include "J.h"
#ifndef J_H_
#define J_H_
#include "B.h"
#ifndef B_H_
#define B_H_
#include "A.h"
class B : public A
{ // error: expected class-name before '{' token
因此,当我们到达B时, A的定义并不完整。有人告诉我,有时您需要使用前向声明,然后将#include语句移动到.cpp文件中,但我对此没有任何运气。如果我尝试这样的事情,我只会得到额外的错误:
error: forward declaration of 'struct ClassName'
我想也许我只是没有在正确的地方做事。有人可以告诉我如何编译这段代码吗?非常感谢你!
编辑:我想指出这只是真实代码的抽象版本。我意识到在A中没有对K或J中的B的引用,但是在真实的代码中有,我觉得它们是完全必要的。也许如果我对真实类进行简要描述,有人可以帮助我重组或修复我的代码。
A类是一个抽象节点类,充当图中节点的接口。B类是A的许多不同实现之一。同理,J类是一个抽象的Visitor类,K是对应的实现。这是具有更多上下文的代码:
啊(抽象节点)
#ifndef A_H_
#define A_H_
#include "K.h"
class K;
class A
{
public:
A();
virtual void accept(const K&) const = 0;
};
#endif /*A_H_*/
A.cpp
#include "A.h"
A::A() {}
Bh(具体节点)
#ifndef B_H_
#define B_H_
#include "A.h"
class K;
class B : public A
{ // error: expected class-name before '{' token
public:
B();
virtual void accept(const K&) const;
};
#endif /*B_H_*/
B.cpp
#include "B.h"
B::B() : A() {}
void B::accept(const K& k) const { k.visit(this); }
Jh(抽象访问者)
#ifndef J_H_
#define J_H_
#include "B.h"
class B;
class J
{
public:
J();
virtual void visit(const B*) const = 0;
};
#endif /*J_H_*/
J.cpp
#include "J.h"
J::J() {}
Kh(具体访客)
#ifndef K_H_
#define K_H_
#include "J.h"
class B;
class K : public J
{ // error: expected class-name before '{' token
public:
K();
virtual void visit(const B*) const;
};
#endif /*K_H_*/
K.cpp
#include "K.h"
K::K() : J() {}
void K::visit(const B*) const {};
主文件
#include "A.h"
int main()
{
return 0;
}
我必须添加一些前向声明以使出现的一些额外错误(当我添加细节时)消失。其中一些可能不是必需的或不正确的。