包含数据的全局静态类

时间:2012-08-17 02:44:32

标签: c++ oop class

我希望有一个静态类,可以容纳不同类型的数据(如目录,值等)。我已尝试使用namespacenamespace s不允许成员变量,我需要保存数据(如果我错了,请纠正我)。

我要做的是为整个程序保存一些常量 - scalingFactorscreenSize等等。然后,我希望这些数据由程序的所有部分共享。像这样:

在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应引用相同的值,即全局静态类scalingFactorGlobals的值。

提前致谢。

编辑:我还需要使用全局函数,它是否与此问题中的变量一样工作?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:5)

C ++没有静态类。只是上课。但这听起来像是命名空间的完美工作。是的,您可以将数据放入名称空间。在头文件中写一个声明,使用extern作为数据;

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

并在一个源文件中提供共享数据的定义:

// 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不会做这种事情。但是,将全局数据传递到每个函数中,无论是否需要,都会产生大量开销。这被称为“tramp数据”,通常反映设计错误。如果这些东西真的是全球性的,那么它们是全球性的,假装它们不是,为了使你的代码“OOP”,这是一个设计错误。

答案 2 :(得分: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() );
  }
}

在您创建FooGoo的位置,您可以将同一个Bar实例传递给两者:

Bar bar;

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

Goo goo(bar);
goo.doSomethingElse();