1

所以我正在尝试制作一个 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 为包括它在内的每个文件创建一个不同的变量。

所以我的问题是,有没有办法声明/实例化这个“无操作”,以便包括这个头的所有文件都可以直接访问同一个唯一实例而不必使用函数?

4

2 回答 2

3

实际上,static关键字在命名空间上下文中的含义与类上下文不同。我相信你想要做的就是extern在你的头文件中声明它,并在实现(.cpp)文件中初始化它一次。看看这个问题

于 2013-03-26T00:09:11.630 回答
0

我在这里做了类似的事情。

我正在使用带有单个全局实例的 Gesture 类作为 gGesture 来处理所有用户交互。

    // .h file
    struct Gesture_{
        int fingers;
        int taps;
        eGestureAction action;
        bool continious;
    };
    typedef struct Gesture_ Gesture;

    extern Gesture gGesture;

为了回答您关于静态与外部的问题,外部通过不向所有翻译单元添加相同的符号来避免链接器问题。

笔记:

  1. 该代码最初旨在用于基于 C 的项目,但我认为您会明白的。

  2. Gesture 对象适用于基于触摸的设备。

于 2013-03-26T01:01:38.157 回答