2014-08-29 39 views
0

我正在开发一个自组织地图程序。 对此,我正在尝试创建一种可以集中所有可以设置的用户/开发人员变量的方法。我一直在尝试使用Config.h/.cpp文件,但我不确定这是否是正确/最好的方法。创建集中式变量文件

看来,如果我不以正确的方式把它放在编译错误。

问题是集中化必须在编译和运行之间更改的变量的最佳/正确方法?

的config.h

#ifndef CONFIG_H_ 
#define CONFIG_H_ 


class Config{ 

public: 


    static const std::string outputFileLocation;// 
    static const std::string inputFilename;// 
    static const std::string outputFileExt;// 

    unsigned int vectorLength = 3;//RGB 


    //VARIBLE USED IN SOM CLASS 
    static const int NODE_GRID_HEIGHT = 100; 
    static const int NODE_GRID_WIDTH = 100; 


}; 

#endif /* CONFIG_H_ */ 

Config.cpp

#include "Config.h" 

//location to store output soms at it is iterated through 
std::string Config::outputFileLocation = "/home/projectFiles/testMedia/results/mySom_"; 

//extension to put on output soms. 
std::string Config::outputFileExt = ".jpeg"; 

////starting rgb image file to proccess 
std::string Config::inputFilename = "/home/projectFiles/testMedia/yellowColor3.jpg"; 


////Length of muliti-dimensional data point. ie. a pixel. 
unsigned int Config::vectorLength = 3; 
+0

在C++中,我非常肯定你必须在声明它们时立即定义'const'变量;你可能想放弃'.cpp'文件,只使用一个头文件。你能提供关于你得到的编译器错误的更多细节吗? – 2014-08-29 19:16:34

+1

你的问题是什么? – 2014-08-29 19:16:58

+0

问题是集中化必须在编译和运行之间更改的变量的最佳/正确方法? – 2014-08-29 19:21:20

回答

1

这是保持在配置一个独特的类的有效方法。因此,您将能够为默认配置定义构造函数,以及配置加载和保存方法。

但是,在您的代码中存在较小的一致性问题。

如果声明:

static const std::string outputFileLocation; // you said const 

那么你应该把它定义为一个常量:

const std::string Config::outputFileLocation = "/home/projectFiles/testMedia/results/mySom_"; 

相反,如果你定义了一个非静态数据成员:

unsigned int vectorLength = 3; //You already intialise it here 

你不能像你那样重新定义它。这只是静态的必要条件。

但是,我想知道你为什么要制作const。这要求它们被初始化(或者像你一样,如果它们是静态的,或者作为普通成员的构造函数的一部分)并且它们可能在之后不会改变。这可以防止您更改配置,例如在启动时加载配置文件时。

更多的想法

一旦你有你的配置类,你可以很容易地决定哪些变量是固定在编译,并应进行动态初始化。动态可能是:

  • 读取配置文件(请参阅:此SO question)。

  • 打通系统环境中的某些变量(见getenv()

  • 系统的具体方法,但这种woudld不能移动的,因此应谨慎考虑(适用于Windows,它通常例如使用registry

  • 使用传递给main()的命令行参数。

0

我推断您使用您的代码来运行实验,因为您需要更改编译和运行之间的变量值。我过去完成这项工作的一个简单方法是将所有内容都集中在头文件中的未命名名称空间中。这样,您可以删除static声明,并且只需要#include配置文件。

就是这样。

Configs.h

#ifndef CONFIG_H_ 
#define CONFIG_H_ 

namespace{ 

    const std::string outputFileLocation = "something";// 
    const std::string inputFilename = "something";// 
    const std::string outputFileExt = "something";// 

    unsigned int vectorLength = 3;//RGB  

    //VARIBLE USED IN SOM CLASS 
    const int NODE_GRID_HEIGHT = 100; 
    const int NODE_GRID_WIDTH = 100; 

}; 
#endif 

注意这可能不是最好的解决办法,但是是简单而有效的。根据项目的目标,您可能需要考虑更优雅的解决方案。

另一个建议

假设我的演绎是正确的,从配置文本文件读取这些值也将是一个不错的选择。您不需要在运行之间重新编译,如果您有一个大型项目,这可能会非常耗时,而且许多其他文件依赖于单个配置。