【发布时间】:2013-03-25 23:56:39
【问题描述】:
所以我正在尝试制作一个 C++ / OpenGL 程序(使用 Visual Studio 2010),它使用一个名为 Operation 的类来处理键盘输入。重点是学习一些东西,因为我对 C++ 和 OpenGL 都是新手。
我正在使用数组“bool keysDown[256]”来存储按下了哪些键。同样,我想创建一个操作数组 'Operation *keyOps[256]' 来操作这些键。
我的问题来了,这些键中的大多数都没有操作,所以我想要一个完全什么都不做的操作类,但我只需要一个不同文件可以使用的全局实例/指针。
现在我想做的是以某种方式创建这个“无操作”类的单个实例,并使其可用于包含此标头的任何文件,而无需在每个文件中声明它。 (类似于 NULL,仅以 Operation 类的形式出现)
到目前为止,我的“解决方案”是使用这样的命名空间,
(操作.h)
#ifndef _OPERATION_H
#define _OPERATION_H
#include <iostream>
#include <GL\glut.h>
namespace operations{
class Operation{
protected:
std::string _name;
public:
Operation(std::string name) : _name(name){}
virtual void operate()=0;
std::string getName(){return _name;}
};
(...)
class OPnop: public Operation{
public:
OPnop(): Operation("No operation"){}
void operate(){}
};
static OPnop OPNOP;
Operation* nop(); //implemented in .cpp > {return &OPNOP;}
(...)
};
#endif
其他文件可以使用 operations::nop() 函数获得指向 OPNOP 实例的指针。我已经测试过并且可以正常工作,但我不确定这是否在后台按预期工作。
我一直在寻找全局变量的 extern 和 static 用法,但我可能并不完全理解,也没有找到与我的问题相关的答案。如果我没记错的话,extern 变量也必须在其他文件中声明,而 static 会为包括它在内的每个文件创建不同的变量。
所以我的问题是,有没有办法声明/实例化这个“无操作”,以便包括这个头文件在内的所有文件都可以直接访问同一个唯一实例,而不必使用函数?
【问题讨论】:
-
请注意,您的包含保护
_OPERATION_H使用 reserved identifier 和一个下划线,后跟一个大写字母。