1

そこで、Operationというクラスを使用してキーボード入力を処理するC ++ / OpenGLプログラム(Visual Studio 2010を使用)を作成しようとしています。重要なのは、C ++とOpenGLの両方に慣れていないので、いくつかのことを学ぶことです。

配列'boolkeysDown [256]'を使用して、押されたキーを格納しています。同様に、これらのキーを操作するために、一連の操作'Operation *keyOps[256]'を作成したいと思います。

そして、ここに私の問題があります。これらのキーのほとんどは操作がないので、まったく何もしないOperationクラスが必要ですが、必要なのは、異なるファイルが使用できる1つのグローバルインスタンス/ポインターだけです。

今私がやりたかったのは、どういうわけかこの「操作なし」クラスの単一のインスタンスを作成し、各ファイルで宣言する必要なしに、このヘッダーを含むすべてのファイルで使用できるようにすることでした。(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インスタンスへのポインターを取得できます。テストして動作しましたが、これがバックグラウンドで意図したとおりに動作するかどうかはわかりません。

私はグローバル変数の外部変数と静的使用法を探していましたが、おそらくそれをすべて理解しておらず、自分の問題に関連する答えを見つけることができませんでした。私が間違っていない場合は、外部変数を他のファイルでも宣言する必要がありますが、staticはそれを含むファイルごとに異なる変数を作成します。

だから私の質問は、このヘッダーを含むすべてのファイルが関数を使用せずに同じ一意のインスタンスに直接アクセスできるように、この「操作なし」を宣言/インスタンス化する方法はありますか?

4

2 に答える 2

3

実際、staticキーワードは、名前空間コンテキストではクラスコンテキストとは異なる意味を持っています。あなたがやりたいのはextern、ヘッダーのように宣言し、実装(.cpp)ファイルで一度初期化することだと思います。この質問を見てください。

于 2013-03-26T00:09:11.630 に答える
0

私はここで似たようなことをしました。

すべてのユーザーインタラクションを処理するために、gGestureとして単一のグローバルインスタンスを持つGestureクラスを使用しています。

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

    extern Gesture gGesture;

静的vsexternに関する質問に答えるために、externは、すべての変換単位に同じ記号を追加しないことにより、リンカーの問題を回避します。

ノート:

  1. このコードは元々Cベースのプロジェクトで機能することを目的としていましたが、あなたはその考えを理解できると思います。

  2. Gestureオブジェクトは、タッチベースのデバイスを対象としています。

于 2013-03-26T01:01:38.157 に答える