包含数据的全局静态类

alx*_*cyl 2 c++ oop class

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

我正在试图做的是保存一些常量整个程序使用- scalingFactorscreenSize仅举几例.然后,我希望这些数据由程序的所有部分共享.像这样的东西:

在Foo.cpp中:

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

在Goo.cpp中:

void doSomethingElse( ) {
   printf( "Scaling Factor is %.2f", Globals.scalingFactor );
}
Run Code Online (Sandbox Code Playgroud)

scalingFactor应该是指相同的值,价值scalingFactor在全球静态类Globals.

提前致谢.

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

Luc*_*ore 9

所以只需将其作为static会员:

//Globals.h
class Globals
{ 
public:
   static float scalingFactor;
}
Run Code Online (Sandbox Code Playgroud)

在单个实现文件中初始化它:

//Globals.cpp
#include "Globals.h"
float Globals::scalingFactor = 42.0;
Run Code Online (Sandbox Code Playgroud)

并使用范围解析运算符来访问它:

float x = Globals::scalingFactor;
Run Code Online (Sandbox Code Playgroud)

我尝试过使用命名空间,但命名空间不允许使用成员变量

您没有正确使用名称空间.以下应该有效:

标题中的声明:

namespace Globals
{
    extern float scalingFactor;
}
Run Code Online (Sandbox Code Playgroud)

和定义:

//Globals.cpp
namespace Globals
{
    float scalingFactor = 42.0;
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ker 5

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

// program_data.h:
namespace program_data {
extern float scalingFactor;
extern int screenSize;
} // namespace program_data
Run Code Online (Sandbox Code Playgroud)

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

// program_data.cpp:
#include "program_data.h"
namespace program_data {
float scalingFactor = 13.765; // whatever...
int screenSize = 640;
} // namespace program_data
Run Code Online (Sandbox Code Playgroud)

无论你需要使用这些东西,只需用他们的命名空间限定名称来引用它们:

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

并且,是的,严格的OOP不会做这种事情.但是,将全局数据传递到每个函数中,无论是否需要,都会产生大量开销.这被称为"tramp数据",通常反映设计错误.如果这些东西真的是全球性的,那么它们是全球性的,假装它们不是,为了使你的代码"OOP",这是一个设计错误.