3

我想要一个静态类来保存不同类型的数据(如目录、值等)。我试过使用namespaces 但namespaces 不允许成员变量,我需要保存数据(如果我错了,请纠正我)。

我要做的是保存一些常量供整个程序使用 -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值,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

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

// 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 回答