2013-03-25 38 views
0

所以我正在嘗試使用名爲Operation的類來處理鍵盤輸入的C++/OpenGL程序(使用Visual Studio 2010)。關鍵是要學習一些東西,因爲我對C++和OpenGL都很陌生。由不同文件共享的C++全局指針

我正在使用數組'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的用法,但我可能不明白這一切,我沒有找到一個答案,我可以與我的問題。如果我沒有弄錯外部變量也必須在其他文件中聲明,而靜態爲每個文件包括它創建一個不同的變量。

所以我的問題是,是否有申報/實例化這個「不操作」,讓所有包含該頭文件將有機會獲得相同的唯一實例都可以直接而無需使用功能的方法嗎?

+0

注意您的包括防護件'_OPERATION_H'使用以下劃線後跟大寫字母[保留標識符(http://stackoverflow.com/q/228783/283302)。 – 2013-03-28 20:49:22

回答

2

事實上,static關鍵字比類上下文中的名稱空間上下文不同的含義。我相信你想要做的是在你的頭文件中聲明它爲extern,並且在實現(.cpp)文件中初始化它一次。看看this question

+0

我做了兩個extern,一個實例和一個指向該實例的指針,然後在.cpp文件中初始化它們。它非常感謝! – aslg 2013-03-26 11:57:09

0

我做了類似的事情here

我用手勢類單一的全球實例作爲gGesture來處理所有的用戶交互。

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

    extern Gesture gGesture; 

要回答你的靜態VS EXTERN問題,通過EXTERN不添加相同的符號,所有翻譯單元避免了連接問題。

注:

  1. 代碼原本打算在一個基於C的項目工作,但我想你會明白我的意思。

  2. 手勢對象專用於基於觸摸的設備。