传递char **作为引用并返回const char *作为引用
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的原因是"不只是让它工作",而是把它做好。
谢谢你的帮助。
编辑:在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引用是有意义的)。
- 将 char 指针传递给接受对 char 数组的引用的函数
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么要使用引用来获取 *char?当我们使用指针时,不使用引用不是更好吗?
- gtest - 未定义对"testing::InitGoogleTest(int*, char**)"的引用
- Qt5 对'QApplication::QApplication(int&, char**, int)'的未定义引用
- 悬空指向 int 和 char* 常量的指针/引用
- 来自类型为std::basic_string::const_iterator的非常量引用的无效初始化,并且<char>来自类型std::basic_string<char>::
- 类型为'std::string&的非常量引用的初始化无效,并且从类型为'std::basic_string<char>的右值
- 将 C++ 转换为 Python 通过引用返回无符号 char*
- 使用cout,如何将char转换为变量的地址/引用(?)
- 从运算符[]返回对映射的char*的引用
- Arduino:未定义的对"I2CRW::readByte(unsigned char, unsigned char)"的引用
- C# PInvoke - 返回 char* 和引用 char* 参数的函数
- 链接器错误(未定义的引用)与“静态 constexpr const char*”和完美转发
- 对'icu_56::UnicodeString::UnicodeString(signed char, unsigned short const*, int)' 的未定义引用
- 如何创建一个32位int和四个8位char类型的并集,每个类型都引用32位int的差分片
- __FILE__可以由C++中的const char*引用
- 从 (void *) "Un-casting"并取消引用 char 数组