3

さまざまな種類のデータ (ディレクトリ、値など) を保持する静的クラスが必要です。sを使用してみましnamespaceたが、namespaces はデータを保持する必要があるメンバー変数を許可しません (ただし、間違っている場合は修正してください)。

私がやろうとしているのは、プログラム全体が使用できるようにいくつかの定数を保存することscalingFactorですscreenSize。次に、それらのデータをプログラムのすべての部分で共有したいと考えています。このようなもの:

Foo.cpp で:

void doSomething( float p_Float ) {
   printf( "Scaled Float is %.2f", p_Float * Globals.scalingFactor );
}

Goo.cpp で:

void doSomethingElse( ) {
   printf( "Scaling Factor is %.2f", Globals.scalingFactor );
}

scalingFactorは同じ値、scalingFactorつまりグローバルな静的クラスのの値を参照する必要がありますGlobals

前もって感謝します。

編集:グローバル関数も使用する必要がありますが、この質問の変数と同じように機能しますか?

4

3 に答える 3

9

だから、それをstaticメンバーとして持ってください:

//Globals.h
class Globals
{ 
public:
   static float scalingFactor;
}

単一の実装ファイルで初期化します。

//Globals.cpp
#include "Globals.h"
float Globals::scalingFactor = 42.0;

スコープ解決演算子を使用してアクセスします。

float x = Globals::scalingFactor;

名前空間を使用してみましたが、名前空間ではメンバー変数を使用できません

名前空間を正しく使用していません。以下が機能するはずです。

ヘッダーの宣言:

namespace Globals
{
    extern float scalingFactor;
}

と定義:

//Globals.cpp
namespace Globals
{
    float scalingFactor = 42.0;
}
于 2012-08-17T02:47:15.820 に答える
6

C++ には静的クラスがありません。ただの授業。しかし、これは名前空間にとって完璧な仕事のように思えます。はい、名前空間にデータを配置できます。データの extern を使用して、ヘッダー ファイルに宣言を記述します。

// program_data.h:
namespace program_data {
extern float scalingFactor;
extern int screenSize;
} // namespace program_data

1 つのソース ファイルで、共有データの定義を提供します。

// program_data.cpp:
#include "program_data.h"
namespace program_data {
float scalingFactor = 13.765; // whatever...
int screenSize = 640;
} // namespace program_data

これらのものを使用する必要がある場合は、名前空間で修飾された名前でそれらを参照してください。

// foo.cpp:
#include "program_data.h"
void doSomething( float p_Float ) {
   printf( "Scaled Float is %.2f", p_Float * program_data::scalingFactor );
}

そして、はい、厳密な OOP はこの種のことを行いません。しかし、グローバル データをすべての関数に渡すと、必要かどうかに関係なく、大量のオーバーヘッドが発生します。これは「トランプ データ」として知られており、多くの場合、設計エラーを反映しています。これらが真にグローバルである場合、それらはグローバルであり、コードを「OOP」にするためにグローバルではないふりをすることは設計エラーです。

于 2012-08-18T18:28:00.763 に答える
2

質問にタグを付けたので、オブジェクト指向システムを設計していると思います。もしそうなら、グローバル変数を使用しないことをお勧めします。渡そうとしているデータに対して意味のあるクラスを作成することを検討し、グローバル変数にアクセスする代わりにオブジェクトを渡します。

例えば:

class Bar {
private:
  float scalingFactor;

public:
  float getScalingFactor() {
    return scalingFactor;
  }
}

class Foo {
private:
  Bar &bar;

public:
  Foo(Bar &bar) : bar(bar) {
  }

  void doSomething( float p_Float ) {
    printf( "Scaled Float is %.2f", p_Float * bar.getScalingFactor() );
  }
}

class Goo {
private:
  Bar &bar;

public:
  Goo(Bar &bar) : bar(bar) {
  }

  void doSomethingElse( ) {
    printf( "Scaling Factor is %.2f", bar.getScalingFactor() );
  }
}

Fooそして、とを作成した場所でGoo、 の同じインスタンスBarを両方に渡すことができます。

Bar bar;

Foo foo(bar);
foo.doSomething(10);

Goo goo(bar);
goo.doSomethingElse();
于 2012-08-17T03:15:55.913 に答える