【发布时间】:2011-02-22 15:04:48
【问题描述】:
现在,我的项目有两个类和一个主类。由于这两个类相互继承,因此它们都使用前向声明。在第一个对象中,在#include 语句的正下方,我在类定义之前初始化了两个枚举。我可以在该类中很好地使用这两个枚举。但是,如果我尝试在继承自第一个类的另一个类中使用这些枚举,则会收到错误消息,指出尚未声明枚举。如果我尝试在第二类中重新定义枚举,则会收到重新定义错误。
我什至尝试过使用我刚刚读到的技巧,并将每个枚举放在自己的命名空间中;这并没有改变任何东西。
这是一个例子:
#ifndef CLASSONE_H
#define CLASSONE_H
namespace Player
{
enum Enum
{
One,
Two,
};
}
#endif
然后在第二个类中,我尝试使用之前声明的枚举:
void AddPlayer(Player::Enum playerNumber);
反而得到一个错误,说'Player'没有被声明。
【问题讨论】:
-
你能给我们看一些简单的代码来证明这一点吗?
-
第二类#包括“Classone.h”吗?
-
是的,classone包括classtwo。
-
为什么classone包括classtwo? #ifndef CLASSONE_H 的全部意义在于防止这种递归包含。基类标头应该包含在派生类标头中,因为派生类需要知道它是从什么派生的。基类不关心派生者是谁,所以你不需要在基类头中包含派生类头。
-
你需要显示你所有的头文件。这在英语中来回是没有帮助的。这就是为什么我们有一种专门针对它的语言,它没有歧义。显示所有受影响的头文件的代码。
标签: c++ enums scope declaration