我有一个类,它解析命令行参数,然后将解析后的值返回给客户机类。为了解析,我需要将argv
传递给解析函数。我想通过引用传递,但据我所知,我们在传递数组时从不使用'&'符号。数组不是可以通过引用传递的对象。下面是我的代码:
#include <iostream>
#include <fstream>
using namespace std;
class cmdline
{
const char * ifile;
public:
cmdline():ifile(NULL){}
const char * const getFile() const
{
return (ifile);
}
void parse(int argc,const char** argv)
{
//parse and assign value to ifile
// ifile = optarg;
// optarg is value got from long_getopt
}
};
int main(int argc, char ** argv)
{
cmdline CmdLineObj;
CmdLineObj.parse(argc, const_cast<const char**>(argv));
const char * const ifile = CmdLineObj.getFile();
ifstream myfile (ifile);
return 0;
}
1) argv
的处理方式是否正确?
2)更好的处理方式,ifile
?
3)我想返回ifile
作为参考,如果需要,我应该做什么改变?
我的代码按照它应该工作的方式工作,但我来SO的原因是"不只是让它工作",而是把它做好。
谢谢你的帮助。
编辑:在Mehrdad的评论之后,我这样编辑:class CmdLine
{
const char * ifile;
public:
const char * & getFile() const
{
return (ifile);
}
但是我得到了错误-从' const char '类型的表达式中初始化' const char*& '类型的引用无效
数组不是可以通过引用传递的对象。
你为什么那么想?
1) argv的治疗方法是否正确?
CmdLineObj。解析(命令行参数个数,const_cast<char**>(argv));
为什么要常量强制转换?您可以将main
的定义更改为const char** argv
,而不是强制转换。
2)更好的处理方式,文件?
好吧,总是有std::string
,但既然你似乎所做的就是把值传递给std::ifstream
,我不认为使用它有什么意义。
3)我想返回一个文件作为参考,我应该做什么改变,如果需要的话?
返回一个指针作为引用有什么意义?您是否期望getFile
的调用者实际更改指向此类字符串的成员?您不应该这样做,因为getFile
是const
成员函数。如果您考虑的是性能,那么在这种情况下返回对指针的引用实际上比按值返回指针更糟糕。当从getFile
返回时,字符串内容不会被复制,就像如果ifile
是std::string
一样(在这种情况下返回const引用是有意义的)。