【发布时间】:2009-04-12 08:15:45
【问题描述】:
在处理包括彼此在内的多个类时出现此错误:
error: expected class-name before '{' token
我知道发生了什么,但我不知道如何正确纠正它。这是代码的抽象版本:
啊.h
#ifndef A_H_
#define A_H_
#include "K.h"
class A
{
public:
A();
};
#endif /*A_H_*/
A.cpp
#include "A.h"
A::A() {}
B.h
#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() {}
J.h
#ifndef J_H_
#define J_H_
#include "B.h"
class J
{
public:
J();
};
#endif /*J_H_*/
J.cpp
#include "J.h"
J::J() {}
K.h
#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() {}
main.cpp
#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 的引用,但在真正的代码,我觉得它们是完全必要的。也许如果我对真实类进行简要描述,有人可以帮助我重组或修复我的代码。
Class A 是一个抽象节点类,充当图中节点的接口。 B 类是 A 的许多不同实现之一。同理,类J是一个抽象的Visitor类,K是对应的实现。这是具有更多上下文的代码:
A.h(抽象节点)
#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() {}
B.h(具体节点)
#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); }
J.h(抽象访问者)
#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() {}
K.h(具体访客)
#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 {};
main.cpp
#include "A.h"
int main()
{
return 0;
}
我必须添加一些前向声明以消除出现的一些额外错误(当我添加细节时)。其中一些可能不是必需的或不正确的。
【问题讨论】:
标签: c++ inheritance forward-declaration