C++ 使用boost::program\u选项的疑问

C++ 使用boost::program\u选项的疑问,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我正在我的一个应用程序中使用boost::program\u选项。使用它,我填充了几乎所有的类参数 因为我需要将“选项”传递给不同的类,所以我在全局范围内声明了variable\u map,并在类头文件之间将其作为extern传递 类似这样的(main.cpp): (DbConnector.cpp) 。。。 DbConnector::DbConnector(const std::string和ownerName): 所有者名称(所有者名称){ dbHost=vm[“db host”].as();

我正在我的一个应用程序中使用
boost::program\u选项。使用它,我填充了几乎所有的类参数

因为我需要将“选项”传递给不同的类,所以我在全局范围内声明了
variable\u map
,并在类头文件之间将其作为
extern
传递

类似这样的(main.cpp):

DbConnector.cpp

。。。
DbConnector::DbConnector(const std::string和ownerName):
所有者名称(所有者名称){
dbHost=vm[“db host”].as();
dbPort=vm[“db port”].as();
dbUser=vm[“db user”].as();
dbPass=vm[“db pass”].as();
dbSchema=vm[“db schema”].as();
...
等等,对于其他课程


我想知道是否有更好的方法来实现这一点,也许可以避免使用
extern
关键字。

我建议将选项表示为它们自己的类(使用普通的旧getter/setter函数),它实现了
boost::program_options
部分,从main调用,然后传递给其他类。@πάνταῥεῖ 我想说,这条建议中的“传递”部分是正确的:避免(美化)全局变量。其余部分高度依赖于上下文。(不要过早地过度设计)。但是,是的,紧密耦合在OP的代码中是显而易见的。
boost::program_options::variables_map vm;

int main(int argc, char* argv[]) {

    using namespace boost::program_options;
    try {
        options_description desc("Allowed options");
        desc.add_options()
        ("help,h", "produce help message")
        ("control-port,c", value<uint16_t>()->implicit_value(6016),
          "The remote TCP port used for listen to probe control connections")
        ("data-port", value<uint16_t>()->implicit_value(6026),
          "The remote TCP port used for listen to probe data connections")
        ("db-host", value<std::string>(),
          "The host name or address of MySQL database")
        ("db-port", value<uint16_t>(), "The port of MySQL database"
        ("db-user", value<std::string>(),
          "The username used to connect to MySQL database")
        ("db-pass", value<std::string>(),
          "The password used to connect to MySQL database")
        ("db-schema", value<std::string>(), "The database scheme used");
extern boost::program_options::variables_map vm;
 ...
DbConnector::DbConnector(const std::string& ownerName_) :
        ownerName(ownerName_) {
    dbHost = vm["db-host"].as<std::string>();
    dbPort = vm["db-port"].as<uint16_t>();
    dbUser = vm["db-user"].as<std::string>();
    dbPass = vm["db-pass"].as<std::string>();
    dbSchema = vm["db-schema"].as<std::string>();
  ...