传递char **作为引用并返回const char *作为引用

Passing char ** as reference and returning const char * as reference

本文关键字:引用 char const 返回 传递      更新时间:2023-10-16

我有一个类,它解析命令行参数,然后将解析后的值返回给客户机类。为了解析,我需要将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的调用者实际更改指向此类字符串的成员?您不应该这样做,因为getFileconst成员函数。如果您考虑的是性能,那么在这种情况下返回对指针的引用实际上比按值返回指针更糟糕。当从getFile返回时,字符串内容不会被复制,就像如果ifilestd::string一样(在这种情况下返回const引用是有意义的)。

相关文章: