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>();
...