[英]Passing char ** as reference and returning const char * as reference
我有一个类,它解析命令行参数,然后将解析后的值返回给客户端类。 为了进行解析,我需要将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的原因是“不随便做”,但要正确地做。
谢谢你的帮助。
编辑::在梅尔达德发表评论后,我这样编辑:
class CmdLine
{
const char * ifile;
public:
const char * & getFile() const
{
return (ifile);
}
但是我得到了错误-从'const char'类型的表达式对类型'const char *&'的引用的无效初始化
数组不是可以通过引用传递的对象。
什么让你有那个想法?
1)argv的处理方式正确吗?
CmdLineObj.parse(argc,const_cast <const char **>(argv));
你为什么要常量转换? 除了强制转换,您还可以将main
的定义更改为const char** argv
。
2)更好的处理方式,如?
好吧,总是有std::string
,但是既然您似乎要做的就是将值传递给std::ifstream
我在使用它时没有任何意义。
3)我想返回ifile作为参考,如果需要,我应该做些什么改变?
返回指针作为参考的意义是什么? 您是否希望getFile
调用者实际上更改指向此类字符串的成员? 您不应该这样做,因为getFile
是const
成员函数。 如果您在考虑性能,那么在这种情况下返回对指针的引用实际上要比按值返回指针更糟糕。 从getFile
返回时,不会复制字符串内容,就像如果ifile
而是std::string
(在这种情况下,返回const引用将很有意义),就不会复制它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.