我正在尝试用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编译器错误,抱怨多个定义。我认为使用标题保护的目的是为了防止多个定义?
有关如何创建一组我可以在整个程序中访问和变异的全局数据字段的任何见解?
答案 0 :(得分:4)
您已宣布您的字段正常。你还没有告诉编译器在哪里存储它们。
正如链接器错误所示,您必须指定一个存储位置,这意味着它不能位于标题中。
添加文件 manager.cpp :
#include "manager.h"
float Manager::AspectRatio = 1.0f; // for the static class member version
答案 1 :(得分:2)
在manager.cpp
float Manager::AspectRatio = 1.0f;
答案 2 :(得分:0)
我相信您收到的错误消息是链接器错误而不是编译器错误。问题是您已将AspectRatio指定为静态浮点数。如果您决定取消使用静态说明符,则可以执行以下操作:
#ifndef MANAGER_H
#define MANAGER_H
class Manager
{
public:
float AspectRatio;
};
int main () {
Manager m;
m.AspectRatio = 10;
}
另外,另外,请避免使用#defines,因为它不是C ++的编程方式。
答案 3 :(得分:0)
静态成员的定义不能在函数内部。
class Manager
{
public:
float AspectRatio;
};
float Manager::AspectRatio = 1.0f;
int main () {
std::cout << Manager::AspectRation << std::endl;
return 0;
}