我運行一個帶有成員var的類作爲參考(對std :: istream),用運算符void *()和bool operator!()返回該引用,我想知道這將是什麼。該類與使用config參數對讀取/解析文本文件相關。我從(大部分)較大的項目中抽出了基本部分。在qt(MSVC 2015社區工具鏈)中,我不得不更改operator void *()
以進行編譯,但在原始Linux系統上似乎沒問題。參考變量的C++操作符,這有什麼作用?
(在我的桌面環境,我得到:「錯誤:C2440:‘迴歸’:無法從‘的std :: istream的’轉換爲‘無效*’」,所以我對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 §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.
}
}
調試Qt中,while (m_reader >> line)
調用操作無效*()。
我的問題:
爲什麼要使用成員變量引用到std::istream
這樣?
返回成員變量&m_in
的地址是什麼時它總是有效的,因爲它是一個成員var(或不是這是真的嗎?)
m_reader的operator *()
會返回false嗎?我在網上搜索了一下,沒有在成員var refs上找到任何類似這種操作符使用的類似示例。我需要看看文件打開失敗時的功能。
可能這個代碼最初使用了堆指針變量或者其他一些方法用於m_in
var,它在某種程度上被改變成了一個普通的成員變量,然後操作符被編輯爲這個?我認爲歷史不容易得到。
感謝您的幫助,stackoverflow是真棒。
thx!很有幫助。 –