一个存储C++ CLI参数的好方法?(不使用库) < >我在C++中写了一个CLI应用程序,它将接受一堆参数。 语法非常典型,-tagarg1 arg2-tag2 arg1

一个存储C++ CLI参数的好方法?(不使用库) < >我在C++中写了一个CLI应用程序,它将接受一堆参数。 语法非常典型,-tagarg1 arg2-tag2 arg1,c++,C++,现在,我使用char**argv并将它们解析为 std::map< std::string, std::list<**std::string** > > > 键是标记,列表将每个标记放在该标记后面但在下一个标记之前。我不想将参数存储为std::strings;但我需要让它更具互动性 所谓交互,我的意思是当用户键入“./myprog-help”时,会出现一个包含所有可用命令的列表,其中包含说明 目前,我的课程是: class Argument { public:

现在,我使用char**argv并将它们解析为

std::map< std::string, std::list<**std::string** > > >
键是标记,列表将每个标记放在该标记后面但在下一个标记之前。我不想将参数存储为std::strings;但我需要让它更具互动性

所谓交互,我的意思是当用户键入“./myprog-help”时,会出现一个包含所有可用命令的列表,其中包含说明

目前,我的课程是:

class Argument
{
public:
   Argument(std::string flag, std::string desc);
   std::string getFlag();
   std::string getDesc(); 
   std:;list<std::string> > getArgs();
   void setArgs(std::list<std::string> > args); 
   bool validSyntax()=0;
   std::string getSyntaxErrorDesc()=0; 
};
映射结构位于一个类ProgramCommands中,该类用于处理这些参数

问题描述结束后,我的4个问题是:

如何让程序的其余部分访问ProgramCommands中的数据? 我根本不想成为单身汉;我不希望把programmands作为arg传递给程序中几乎所有的函数。 你有没有更好的办法来储存我是怎么做的? 如何最好地向程序中添加参数,而不将其硬编码到ProgramCommands或main中? string只允许一行描述,除了使用字符串列表或boost之外,还有人有优雅的解决方案吗? 编辑
我真的不想使用图书馆,因为这是一个嗅探和解释数据包的学校项目。如果我愿意,我可以,但我不愿意。

存储命令行参数的选择是:将它们设置为全局参数,或者将它们传递给需要它们的函数。哪种方式最好取决于你的选择

如果你的程序中有很多地方需要这些选项,比如“verbose”选项,那么我就把这个结构变成一个全局结构,继续我的生活。它不需要是单身,你仍然只有一个,但那没关系

如果您只需要启动时的选项,即初始启动的线程数或连接的端口数,那么您可以将解析保持在“main”本地,并将所需的参数传递给相应的函数


我倾向于使用久负盛名的getopt库解析选项是的,这是C语言的一个遗留问题-它工作得很好,我将选项信息标志、值填充到一个全局结构或一系列全局变量中。我通过一个函数“print_usage”给出用法说明,该函数只将基本用法信息打印为一个文本块。我发现它很有效,很快,很简单,而且完成了任务。

我不理解你反对使用单件来-这是他们的初衷。如果您希望每个对象都可以访问它们,但不希望将它们作为参数传递或使用singlton,那么我只能想到几个技巧:

-将解析后的参数放入共享内存,然后从每个需要它们的函数中读取它们 -将解析后的参数写入二进制文件,然后从每个需要它们的函数中读取它们 -全局变量


这些解决方案没有一个像单件产品那么优雅,劳动密集度更高,而且很好。。。和单身汉相比有点傻。。。为什么要束缚自己?

你反对使用图书馆的理由是什么?现在,命令行参数是一个解决得很好的问题。您可能想看看[Boost.ProgramOptions][1]。它能满足你的所有要求。我知道你说没有助推,但你会节省很多时间。[1] 当前位置我知道有无数的libs可以为我做这一切;但是我在这个项目上是土生土长的,只使用libpcapYou不需要singleton/glbal,也不想将它们作为参数传递。。。?我认为你将不得不做一些你不想做的事情。格鲁德利格,你可能是对的。我几乎同意你在这里所说的一切——然而——单例不是比全局变量更好的解决方案吗?嗯,打印描述比存储字符串更好;“我会用它的。”谢恩-我所在的阵营认为,单身模式应该少用,如果有的话。你只创建其中一个的单例和全局有什么区别?除了在调用main之后创建的singleton之外,没有什么意义。单例有一些用途,但在大多数情况下,它们不值得付出努力——它们实际上只是假装不需要的全局变量。我说,停止假装。”米迦勒-我愿意同意你的意见,除了静态对象中实例化的顺序在C++中是未定义的,因此如果一个全局静态引用另一个,那么你怎么能确定它是初始化的?更重要的是,我不认为单例是“麻烦”,所以我自己更喜欢它们而不是全局对象。呃,我可能已经听了太多次“没有全局对象”这个短语了。坦白地说,我会说单身是最好的选择,但也许有人会有更好的方式。