我遇到了一个类,其成员var作为引用(到std :: istream),运算符void *()和bool运算符!()返回该引用,我想知道它会是什么对于。该类与使用config参数对读取/解析文本文件有关。我从(更大)更大的项目中撤出了基本部分。在qt(MSVC 2015社区工具链)中,我不得不更改operator void *()
以获得编译,但在原始linux系统上似乎没问题。
(在我的桌面环境中,我得到:“错误:C2440:'返回':无法从'std :: istream'转换为'void *'”,所以我替换为调用if(m_in.eof())
和{ {1}})
return nullptr
以及使用它的类:
class LR { // (line reader)
public:
LR(const std::string &filename);
.... other stuff
operator void *() const { return &m_in; }
bool operator !() { return !m_in; }
LR & operator>>(std::string &line);
private:
std::istream &m_in; // input stream
std::ifstream m_in_file; // input file (if specified)
};
LR::LR(const std::string &filename, ... other stuff) :
: m_in(m_in_file)
{
// .... other stuff
if(filename.size() > 0)
{
m_in_file.open(filename.c_str());
}
// .... other stuff
}
在Qt中调试,class CR { // config reader
public:
// .... other stuff
void Load_Variable(const std::string §ion, value, etc...);
private:
LR m_reader;
};
void CR::Load_Variable(const std::string §ion, value, etc.) {
string line;
bool found = false;
while (m_reader >> line)
{
// .... check stuff, etc.
}
}
调用操作符void *()。
我的问题:
为什么要像这样使用while (m_reader >> line)
的成员var引用?
当成员var std::istream
的地址始终有效时,返回成员var &m_in
的地址的目的是什么,因为它是成员var(或者这不是真的?)
m_reader的operator *()
会返回false吗?我在网上搜索了一下,并没有在成员var refs上找到任何类似的运算符使用的类似例子。当文件打开失败时,我需要查看它的作用
可能这段代码最初使用堆指针变量或其他方法用于m_in
var并且它在某处改变为正常成员var,然后运算符编辑到此?我认为历史不容易得到。
感谢您的帮助,stackoverflow非常棒。
答案 0 :(得分:0)
istream有一个标志,指示是否发生了错误,它会覆盖!操作员方便访问。你会经常看到它像这样使用:
myStream >> line;
if(!myStream)
cout<<"Error reading data"<<endl;
所以你没有返回引用,你返回一个布尔标志。想想!运算符为isNoError()
访问者。
你的类正在做同样的事情,只是从它包装的流中传递结果。
*运算符可能作为向后兼容性度量。可能现有的代码库期望一个指针,并且这是添加的,以便现有的代码库与新的实现一起使用。