我希望有一个静态类,可以容纳不同类型的数据(如目录,值等)。我已尝试使用namespace
但namespace
s不允许成员变量,我需要保存数据(如果我错了,请纠正我)。
我要做的是为整个程序保存一些常量 - 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
的值。
提前致谢。
编辑:我还需要使用全局函数,它是否与此问题中的变量一样工作?
答案 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)
由于您已标记了问题oop,我假设您正在设计面向对象的系统。如果是这样,我建议不要使用全局变量。考虑为您尝试传递的数据创建有意义的类,然后传递对象而不是访问全局变量。
例如:
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();