2013-11-02 95 views
0

嘿,我有一個類的問題。它應該有一個方法返回相同的類,但與其他私人構造函數。但它無法與特定錯誤:C++用私有構造函數返回一個類實例

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : 
      cannot access private member declared in class ' 

這是頭文件:

class XMLClass { 
private: 

    bool isGood(); 
    std::vector<std::string> xmlRowList; 
    std::fstream xmlFS; 
    XMLClass(std::string newList); 

public: 

    XMLClass(char *filename,std::string root); 
    std::string getAttribute(char *att); 
    std::string getText(void); 
    XMLClass getChildNode(std::string childNode); 
}; 

這是使錯誤的方法:

XMLClass XMLClass::getChildNode(std::string Node) 
{ 
    XMLClass newXML(Node); 
    return newXML; 
} 
+0

如何在代碼中調用getChildNode?你可以請張貼嗎?你可以請張貼XMLClass(s​​td :: string newList)嗎? – nio

+1

這可能是由於嘗試複製'fstream';但是你已經失去了錯誤信息的重要部分,告訴我們哪個類具有無法訪問的構造函數。 –

回答

1

有人可能會寫更詳細的答案,但我認爲問題是這樣的:

std::fstream xmlFS; 

您不能複製它,這是需要這個返回由值:

return newXML; 

解決方案應編寫拷貝構造函數和賦值運算符爲你的類,它正確地處理這個成員變量。

檢查出C++ Rule of Three當你在它。

+0

所以他應該存儲指向xmlFS的指針,並將指針複製到新的XMLClass實例? – nio

+0

指向物體散佈在值對象的許多副本上的指針可能會很棘手......使用共享指針可能,但可能很麻煩。 – hyde

4

問題是fstream類成員 - 流是不可複製的,因此,您的類也是如此。

要按值返回函數的對象,您需要一個拷貝構造函數。但你沒有一個,因爲默認生成一個會不合格。

如果你有C++ 11的支持,你可以實現你的類的移動構造函數。如果不是,則需要存儲指向流的指針。

相關問題