C++管理器数据字段

C++ Manager Data Fields

本文关键字:字段 数据 管理器 C++      更新时间:2023-10-16

我正在尝试用C++创建一个管理器类,或者至少是全局可用数据字段的集合。我只是想能够在不需要函数的情况下获取和设置一些全局数据。如果可以的话,我也希望避免使用辛格尔顿。

我试过一个静态类:

#ifndef MANAGER_H
#define MANAGER_H
class Manager
{
public:
    static float AspectRatio;
};
#endif MANAGER_H

但是当我尝试使用"Manager::AspectRatio"时,我收到了LNK2001编译器错误,抱怨未解析的外部错误

我也尝试过全球领域:

#ifndef MANAGER_H
#define MANAGER_H
float Manager_AspectRatio = 1.0f;
#endif MANAGER_H

但当我在多个文件中包含"manager.h"时,我会收到LNK2005编译器错误,抱怨有多个定义。我认为使用标题保护的目的是为了防止多重定义?

关于如何创建一组全局数据字段,以便在整个程序中访问和变异,有什么见解吗?

您已声明您的字段良好。您只是没有告诉编译器将它们存储在哪里。

正如链接器错误所示,您必须指定一个存储位置,这意味着它不能在标头中。

添加文件manager.cpp:

#include "manager.h"
float Manager::AspectRatio = 1.0f; // for the static class member version

manager.cpp

float Manager::AspectRatio = 1.0f;

我相信,您收到的错误消息是链接器错误,而不是编译器错误。问题是您已经将AspectRatio分配为静态浮点。如果您决定取消静态说明符,可以执行以下操作:

#ifndef MANAGER_H
#define MANAGER_H 
class Manager
{
public:
    float AspectRatio;
};
int main () {
     Manager m;
     m.AspectRatio = 10;
}

此外,顺便说一句,避免使用#defines,因为它不是C++编程方式。

静态成员的定义不能在函数内部。

class Manager
{
public:
    float AspectRatio;
};
float Manager::AspectRatio = 1.0f;
int main () {
   std::cout << Manager::AspectRation << std::endl;
   return 0;
}