【问题标题】:C++ operators on reference vars, what does this do?引用变量上的 C++ 运算符,这是做什么的?
【发布时间】:2016-12-29 16:49:24
【问题描述】:

我遇到了一个以成员 var 作为引用的类(对 std::istream),操作符 void *() 和布尔操作符 !() 返回该引用,我想知道那会是什么为了。该类与使用配置参数对读取/解析文本文件有关。我已经从(大得多的)项目中提取了基本部分。在 qt(MSVC 2015 社区工具链)中,我必须更改 operator void *() 才能编译,但在原始 linux 系统上似乎没问题。

(在我的桌面环境中,我得到:“错误:C2440:'return': cannot convert from 'std::istream' to 'void *'”,所以我替换为对if(m_in.eof())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
}

以及使用它的类:

class CR { // config reader
public:
  // .... other stuff
  void Load_Variable(const std::string &section, value, etc...);
private:
  LR m_reader;
};
void CR::Load_Variable(const std::string &section, value, etc.) {
  string line;
  bool found = false;
  while (m_reader >> line)
  {
    // .... check stuff, etc.
  }
}

在 Qt 中调试,while (m_reader >> line) 调用操作符 void *()。
我的问题:
为什么要像这样使用成员 var 对 std::istream 的引用?
返回成员 var &m_in 的地址的目的是什么,因为它始终有效,因为它是成员 var(或者这不是真的?)
m_reader 的 operator *() 会返回 false 吗?我在网上搜索了一下,没有找到任何类似的在成员 var refs 上使用运算符的例子。接下来我需要看看当文件打开失败时它会做什么。
可能这段代码最初使用堆指针变量或m_in 变量的其他方法,并且在途中某处更改为普通成员变量,然后将运算符编辑为此?我认为历史并不容易获得。
感谢您的帮助,stackoverflow 很棒。

【问题讨论】:

    标签: c++


    【解决方案1】:

    istream 有一个标志,指示是否发生了错误,它会覆盖!操作员方便访问。你会经常看到它是这样使用的:

    myStream >> line;
    if(!myStream)
       cout<<"Error reading data"<<endl;
    

    所以你不是在返回一个引用,你是在返回一个布尔标志。想想!运算符为isNoError() 访问器。

    你的类也在做同样的事情,只是通过它包装的流的结果。

    * 操作符可能是作为向后兼容性措施存在的。可能现有的代码库需要一个指针,并且添加了它以便现有的代码库与新的实现一起使用。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2014-09-16
      • 2013-08-08
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多