1

我正在尝试在 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 编译器错误,抱怨多个定义。我认为使用标头保护的目的是防止多个定义?

关于如何创建一组可以在整个程序中访问和改变的全局数据字段的任何见解?

4

4 回答 4

4

你已经宣布你的领域很好。您只是没有告诉编译器将它们存储在哪里。

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

添加文件manager.cpp

#include "manager.h"
float Manager::AspectRatio = 1.0f; // for the static class member version
于 2013-08-06T18:14:45.630 回答
2

在你的manager.cpp

float Manager::AspectRatio = 1.0f;
于 2013-08-06T18:12:24.483 回答
0

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

#ifndef MANAGER_H
#define MANAGER_H 

class Manager
{
public:
    float AspectRatio;
};

int main () {
     Manager m;
     m.AspectRatio = 10;

}

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

于 2013-08-06T18:29:41.493 回答
0

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

class Manager
{
public:
    float AspectRatio;
};

float Manager::AspectRatio = 1.0f;
int main () {
   std::cout << Manager::AspectRation << std::endl;
   return 0;
}
于 2013-08-06T19:44:07.073 回答