【问题标题】:Passing char ** as reference and returning const char * as reference传递 char ** 作为引用并返回 const char * 作为引用
【发布时间】:2011-09-18 04:45:05
【问题描述】:

我有一个类可以解析命令行参数,然后将解析后的值返回给客户端类。对于解析,我需要传递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*&”类型的引用进行无效初始化

【问题讨论】:

  • “我的代码按其应有的方式工作”是什么意思?这段代码甚至无法编译。
  • @Mankrase,我已经编辑了代码。它现在编译得很好。感谢您指出。你觉得这段代码有什么问题吗(我的意思是一些未定义的行为或我绝对应该注意的事情?我真的想通过引用返回 ifile)
  • @Ian: const char * const getFile() const 毫无意义。第二个const 应该做什么?
  • @Mehrdad ,不应该是指向 const char * 的 const 指针吗?如果不需要,我可以将其删除。感谢您的输入。知道如何返回 ifile 作为参考吗?
  • @Ian: 将“const 指针”返回给某物没有任何意义,因为它的行为与 不是 'const' 的指针没有什么不同(因为它是返回方法的类型,通常不能分配给返回值)。至于通过引用返回ifile:为什么不直接返回const char *&amp;

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


【解决方案1】:

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

是什么让你这么想?

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

CmdLineObj.parse(argc, const_cast(argv));

你为什么要 const 转换它?您可以将 main 的定义更改为 const char** argv,而不是强制转换。

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

嗯,总是有std::string,但由于您似乎只是将值传递给std::ifstream,所以我认为使用它没有意义。

3) 我想返回 ifile 作为参考,如果需要,我应该做哪些更改?

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

【讨论】:

  • 不,编译器不会隐式进行转换,因为它是unsafe
  • @K-ballo,我是知识匮乏危险的完美例子。传递 argv 作为参考我应该怎么做?如果它有任何好处?
  • @Mankarse:你说得对,我会相应地编辑问题。
  • @K-ballo - 然而,改变 main 的定义会让你得到一个不符合标准的程序。 main 唯一需要的两个签名是int main()int main(int argc, char argv[])。也就是说,我不知道有任何编译器不允许int main(int argc, char const argv[])
  • @K-ballo,你是对的 - 标准明确提到了 main 实现定义签名的可能性,但是如果你希望能够保证你的程序可以在 any 上运行 符合实现,那么你不能依赖这些东西。我个人认为 const 正确性增益可能足以证明使用非标准 main 是合理的,但仍然值得注意。
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2011-04-15
  • 2012-11-10
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多