2017-02-04 21 views
2

私はC++ 静的クラスのプライベート静的メンバーを持っています(シングルトンクラスに非常に似ていますが、自動的に行われるのでクラスのインスタンスを割り当てる必要はありません)。初期化関数で静的クラスメンバーを初期化する

とにかく、この静的メンバーを初期化したいと思います。一般的に、人は以下の

Example.h

class Example 
{ 
    private: 
    static OtherClass _value; 
    Example() {} 
}; 

Example.cpp

#include "Example.h" 
OtherClass Example::_value(constructor arguments) 

私は現在、これを許可しません書いているコードを実行して、これについて行くだろう。基本的にOpenGL用のDebugDrawクラスを作成しています。このクラスには、OpenGLシェーダを作成するShaderオブジェクト用の独自の静的メンバーが含まれています。上記の方法を使用すると、グリップが初期化される前にシェイダーが構築され、大きな問題が発生します。

これは私が使用している解決策です。このように書か

Example.h

class Example 
{ 
    public: 
    Initialize(); 
    private: 
    static OtherClass _value; 
    Example(){} 
}; 

Example.cpp

#include "Example.h" 

Example::Initialize() 
{ 
    OtherClass _value(constructor arguments) 
    // Other code that I will need to add 
} 

コードがコンパイルされますが、それは私が(静的クラスのメンバを初期化する)を探しています所望の効果を持っているのだろうか? Initialize関数が呼び出される前の静的メンバーの平均は何ですか(初期化されたブールをそこに置くつもりです)。

ありがとうございました

私が実際に使用しているコードは次のとおりです。

DebugDraw.h

#ifndef DEBUGDRAW_H 
#define DEBUGDRAW_H 

#include <GLM\glm\vec4.hpp> 

#include "Shader.h" 

class DebugDraw 
{ 
    public: 
    static void Initialize(); 
    static void Line(); 
    static void Triangle(); 
    static void Box(); 
    static void Color(); 
    private: 
    static glm::vec4 _color; 
    static Shader _shader; 
    DebugDraw() {} 
}; 

#endif // !DEBUGDRAW_H 

DebugDraw.cpp

#include "DebugDraw.h" 

void DebugDraw::Initialize() 
{ 
    glm::vec4 _color(1.0f, 1.0f, 1.0f, 1.0f); 
    Shader _shader("Shader/debug.vert", "Shader/debug.frag"); 
    _shader.Use(); 
} 

^これはコンパイルん^初期化関数が呼び出される前に、静的メンバーの平均値を何

+0

本当にコンパイルできますか?クラス宣言の終わりの後に ';'がありません。 – Raindrop7

+0

yeaymこのコードは一例です。私は書いているOpenGLコードを投稿したくなかった。私はちょうどこの1つについて知りたいです – Underdisc

答えて

0

(初期化されたブールもそこに置くつもりです)。

あなたの静的変数とは何の関係もありません_valと呼ばれるローカル変数を(これは_valueべきか)、作成しています。したがって、あなたのコードはリンクさえできません。


あなたが意図しているものを行うには、あなたがあなたの最初のExample.cppに示してきたばかりのように、変数を初期化しますが、コンストラクタ引数なしになります。

#include "Example.h" 
OtherClass Example::_value; 

がいることを確認してください引数を持たないコンストラクタは実際の初期化を行いません! OtherClass::initializeメソッドを作成することでこれを遅延させます。

#include "Example.h" 
OtherClass Example::_value; 

Example::Initialize() 
{ 
    Example::_value.initialize(...); 
} 

また、あなたが_valueのポインタを作ることができ、NULLに割り当て、あなたがそれ必要とするとき、ヒープ上にそれを割り当てる:ときdeleteにそれを忘れないでください

​​

をもうそれは必要ありません。または、C++ 11を使用できる場合は、代わりにstd::shared_ptr<OtherClass>を使用してください。

+0

申し訳ありませんが、 '_val'から' _value'に編集されました。では、2番目の実装(つまり、 'Example :: Initialize()'関数で静的初期化を実行するとどういう意味でしょうか?私はOtherClassにInitialize関数があるメソッドを使用しようとしていましたが、それをやめさせてくれるいくつかの詳細がありました。本当にクラスのデフォルトコンストラクタは悪い考えのように思えました。 – Underdisc

+0

あなたは何を求めているのですか? 2番目の実装では、まだ 'static'変数を使用していますが、' OtherClass'のインスタンスに設定するまではポインタで、 'NULL'で始まります。 – Lignum

+0

私は、元の質問で提供された2番目の実装を参照しています。 'Example :: Initialize()'関数の '_value'はスタック上に新しい変数を作成していますか、それとも静的メンバ' _value'を初期化していますか?彼らは同じ識別子を持っているので、私は何が起こっているか完全にはわかりません。 – Underdisc

関連する問題