C++中类似Python的静态数据存储
Python-like storage of static data in C++?
当我有测试数据对象或其他静态数据对象(如SQL字符串)时,我喜欢将它们排除在应用程序代码之外。在Python中,这是通过一个单独的源文件和一个导入来完成的,如下所示。C++是如何组织和使用静态数据的?
(file: testdata.py)
x = Foo() (an object)
x.name = "Bar"
x.number = 123
..
(file: test.py)
import testdata.py
testObject1 = testdata.x
..
有很多可能性。这也取决于您试图做什么(例如,您希望值在编译后是可编辑的,还是仅在编译前可编辑?
至于后面的,你可以使用一个单独的翻译单元。
在某些头文件中:
extern const char *name;
extern const int number;
在一个单独的源文件中:
const char *name = "Bar";
const int number = 123;
然而,您也可以使用类/结构方法:
头文件:
struct Foo {
const char *name;
int number;
};
extern const Foo Bar;
源文件:
const Foo Bar = {"Bar", 123};
对于连接字符串等,最灵活的选择是创建一个设置文件(使用您自己选择的格式)和一个可以读取文件的类,因为这允许您在不重新编译程序的情况下更改设置。
对于要包含在代码中的静态数据,可以使用静态类成员:
// file.h
class Foo {
public:
static string getBar();
private:
static string bar;
};
// file.cpp
Foo::bar = "qwe";
static Foo::getBar() {
return bar;
}
您也可以将它们放在另一个文件中;头文件中的extern
数据声明,以及.cpp文件中的定义,如下所示:
// Foo.h
extern Foo afoo;
extern int anint;
// Foo.cpp
Foo afoo;
int anint = 0;
然后,您可以在任何需要使用afoo
和anint
的地方使用#include "Foo.h"
。
有很多方法可以从源代码中存储数据。
例如,配置文件存储在XML中,尽管(幸运的是)JSON已经获得了一些基础(没有我想要的那么多),而且还有自定义格式。
另一个例子是,对于翻译,您可以使用gettext并将字符串存储在.po文件中,并在不重新编译的情况下添加新语言。
最终,一切都以相同的方式进行:
- 定义文件的格式
- 您创建了一个读取器(也许还有编写器)过程,用于在文件格式和内存格式之间进行转换
- 您可以找到一种将文件路径传递给程序的方法:当前目录中的固定名称、主目录中的定名、命令行参数、环境变量等
如果你想像在Python中那样做,你也可以将资源编译到它们自己的DLL中,并在加载符号时在运行时提取它们,更改资源只需要重新编译这一个DLL。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 内联静态数据的初始化
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 访问模板化类的非模板基的静态数据
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- 是否允许在作为静态数据结构成员的lambda函数中捕获变量
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)