2016-12-29 30 views
0

我運行一個帶有成員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 &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)調用操作無效*()。
我的問題:
爲什麼要使用成員變量引用到std::istream這樣?
返回成員變量&m_in的地址是什麼時它總是有效的,因爲它是一個成員var(或不是這是真的嗎?)
m_reader的operator *()會返回false嗎?我在網上搜索了一下,沒有在成員var refs上找到任何類似這種操作符使用的類似示例。我需要看看文件打開失敗時的功能。
可能這個代碼最初使用了堆指針變量或者其他一些方法用於m_in var,它在某種程度上被改變成了一個普通的成員變量,然後操作符被編輯爲這個?我認爲歷史不容易得到。
感謝您的幫助,stackoverflow是真棒。

回答

0

該istream有一個標誌,指示是否發生錯誤,它覆蓋!操作員輕鬆訪問。你會經常看到它是這樣使用的:

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

所以你沒有返回一個引用,你返回一個布爾標誌。想想!運營商爲isNoError()訪問者。

你的類正在做同樣的事情,只是通過它包裝的流的結果。

*運算符可能在那裏作爲向後兼容性度量。現有的代碼庫可能需要一個指針,並添加了這個指針,以便現有代碼庫與新實現一起工作。

+0

thx!很有幫助。 –