【发布时间】:2016-04-18 06:51:37
【问题描述】:
所以我有一个主要包含静态内容的类,因为它需要是一个随时可访问且无需实例化的库。无论如何,这个类有一个公共静态成员,一个名为 cfg 的结构,它包含它的所有配置参数(主要是由它的静态方法实现的算法的边界和容差)。最重要的是它有一个 const 静态成员,它是一个与 cfg 类型相同的结构,但具有参数的所有默认/通常值。我的模块的用户可能会加载它,对其进行部分修改,并将其作为 cfg 应用,或将其用作参考,或者我知道什么。
现在我似乎根本无法初始化这个家伙。没有实例化(并且它是静态的)初始化不会在构造函数中发生(反正没有)。 in-class init 返回错误,在 cpp 中的 init 返回声明冲突。这里的前进方向是什么?
这是一个与我得到的行为完全相同的示例:
模块.h:
#ifndef MODULE_H
#define MODULE_H
typedef struct {
float param1;
float param2;
} module_cfg;
class module
{
public:
module();
static module_cfg cfg;
const static module_cfg default_cfg;
};
#endif // MODULE_H
模块.cpp:
#include "module.h"
using namespace std;
module_cfg module::default_cfg = {15, 19};
int main(int argc, char* argv[])
{
//clog << "Hello World!" << endl << endl;
return 0;
}
module::module()
{
}
以上错误:
module.cpp:11:20: 错误: 冲突声明 'module_cfg module::default_cfg' module_cfg 模块::default_cfg = {15, 19}; ^ 在 module.cpp:8:0 包含的文件中: module.h:14:29:错误:'module::default_cfg' 之前的声明为 'const module_cfg module::default_cfg' 常量静态模块_cfg default_cfg; ^ Makefile.Debug:119:目标“debug/module.o”的配方失败 module.cpp:11:20: 错误: 'const module_cfg module::default_cfg' 在类外的声明不是定义 [-fpermissive] module_cfg 模块::default_cfg = {15, 19};
提前致谢,
查尔斯
【问题讨论】:
-
听上去是singleton的变种,不过最好看看类代码和使用示例
-
在 cpp 文件中初始化将是可行的方法。请告诉我们mcve,它会重现您看到的错误。
-
默认配置是否应该以某种方式依赖于
.cfg? -
顺便说一句,我通过在 .cpp 中的声明中添加“const”来修复它 - 编译器似乎需要它。问题是 - 为什么我必须在 cpp 中重新声明类型/特征,而所有这些都已经在 h 文件中?为什么我不能直接写:module::default_cfg = {1000, 1000}?
-
@C.THIN:如果您有新问题,请单独提出。
标签: c++ static initialization constants member