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

时间:2011-09-18 04:45:05

标签: c++ unix multidimensional-array reference argv

我有一个类解析命令行参数,然后将解析后的值返回给客户端类。对于解析,我需要将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 *&amp;'类型的引用无效

1 个答案:

答案 0 :(得分:0)

  

数组不是可以通过引用传递的对象。

是什么让你这么想?

  

1)argv的处理方式是否正确?

     

CmdLineObj.parse(argc,const_cast&lt; const char **&gt;(argv));

你为什么要施放那个?您可以将main的定义更改为const char** argv

,而不是强制转换
  

2)更好的处理方式,ifile?

好吧,总有std::string,但是因为您似乎只是将值传递给std::ifstream我觉得使用它没什么意义。

  

3)我想将ifile作为参考,如果需要,我应该做些什么改变?

将指针作为参考返回有什么意义?您是否期望getFile的呼叫者实际更改指向此类字符串的成员?您不应这样做,因为getFileconst成员函数。如果你正在考虑性能,那么在这种情况下返回对指针的引用实际上比通过值返回指针更糟糕。从getFile返回时,字符串内容不会被复制,就像ifile而不是std::string一样(在这种情况下返回const引用会有意义)。