所以我试图制作一个C ++ / OpenGL程序(使用Visual Studio 2010),使用名为Operation的类来处理键盘输入。关键是要学习一些东西,因为我不熟悉C ++和OpenGL。
我正在使用数组'bool keysDown [256]'来存储按下哪些键。同样,我想制作一组操作'Operation * keyOps [256]'来操作这些键。
这就是我的问题,大多数这些键都没有操作,所以我想要一个什么都不做的Operation类,但我只需要一个不同文件可以使用的全局实例/指针。
现在我想要做的是,以某种方式创建这个'无操作'类的单个实例,并使其可用于包含此标头的任何文件,而无需在每个文件中声明它。 (像NULL这样的东西,只有在Operation类的形状中)
到目前为止,我的'解决方案'是使用这样的命名空间,
(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实例的指针。我已经测试过它的确有效,但我不确定它是否能在后台运行。
我一直在寻找全局变量的外部和静态用法,但我可能并不理解这一切,而且我找不到可能与我的问题相关的答案。如果我没弄错,外部变量也必须在其他文件中声明,而静态为每个文件创建一个不同的变量,包括它。
所以我的问题是,有没有办法声明/实例化这个'无操作',以便所有包含此标题的文件都可以直接访问同一个唯一实例而无需使用函数?
答案 0 :(得分:3)
实际上,static
关键字在名称空间上下文中的含义与类上下文不同。我相信您要做的是在标头中将其声明为extern
,并在实现(.cpp
)文件中初始化一次。看看this question。
答案 1 :(得分:0)
我做了类似的here。
我正在使用一个带有单个全局实例的Gesture类作为gGesture来处理所有用户交互。
// .h file
struct Gesture_{
int fingers;
int taps;
eGestureAction action;
bool continious;
};
typedef struct Gesture_ Gesture;
extern Gesture gGesture;
要回答关于static vs extern的问题,extern通过不向所有翻译单元添加相同的符号来避免链接器问题。
注意:
该代码原本打算在基于C的项目中工作,但我想你会明白这个想法。
Gesture对象适用于基于Touch的设备。