问题是C++不允许在类内进行 namespace 声明。(我在Internet上搜索并找到了它;如果不正确,请说出来)那么,欺骗这个问题的最佳方法是什么?
上下文:我的类(class)内有一个枚举。
class GameCharacter {
public:
enum MovingState {
Running,
Walking,
Stopped
};
...
};
OBS:这个例子不是真实的,完全是假设的。
C++定义枚举名称在类范围内,然后,要使用这些状态,我必须直接从类名称(例如
GameCharacter::Running
或using GameCharacter::Running
)中使用范围运算符。我认为这很不好,因为属于枚举的名称在类范围内;我想要一个RunningState枚举的范围。 (以这种方式访问它:
GameCharacter::MovingState::Running
)然后,我的第一个想法是创建一个命名空间,该命名空间将定义枚举的范围。
class GameCharacter {
public:
// does not compile
namespace MovingState {
enum State {
Running,
Walking,
Stopped
};
};
...
};
但是C++禁止这样做。此代码无法编译。 (
main.cpp:3:5: error: expected unqualified-id before ‘namespace’
)我尝试以这种方式进行操作的原因是因为有可能使用相同范围的名称创建第二个枚举。这可能导致名称冲突。
class GameCharacter {
public:
enum MovingState {
Running,
Walking,
Stopped
};
enum DrivingState {
Accelerating,
Breaking,
Stopped // Compilation error: conflicts with previous declaration ‘GameCharacter::MovingState GameCharacter::Stopped’
};
...
};
(我的想法是,在这种情况下,状态应称为
GameCharacter::MovingState::Stopped
和GameCharacter::DrivingState::Stopped
)那我该怎么办
最佳答案
在C++ 1x(去年标准化的C++的新版本)中,可以使用strongly typed enumerations,它将标识符放在enum类本身的范围内(除其他改进外)。这些用enum class
声明:
class GameCharacter {
public:
enum class State {
Running,
Walking,
Stopped // Referred to as GameCharacter::MovingState::Stopped.
};
...
};
同时,如果您坚持使用C++ 03编译器或想保持兼容性,只需使用
class
而不是namespace
并按照您自己的答案中的建议将构造函数声明为私有(private)。如果外部世界不需要看到它,则可以将整个class
设为私有(private)。