2013-10-22 78 views
-3

我在懷疑關於cin和cout對象的聲明。根據我的理解cin和cout這兩個對象都可以在main中訪問,所以它們不應該有protected.in下面的代碼片斷我已經重載了輸入和輸出操作符,並且給該操作符的用戶定義的版本賦予新名稱(ofstream obj) ,我得到像obj這樣的錯誤是受保護的,無法在這裏訪問。任何人都可以建議。cin和cout重新聲明

#include<iostream> 
using namespace std; 

class overload 
{ 
public: 
    int var_a; 
    overload (int fun_a=10): var_a(fun_a) {} 
    friend ostream operator >> (ostream &output, overload &); 
    friend istream operator << (istream &input, overload &); 
}; 

ostream &operator <<(ostream &output, overload &s1) 
{ 
    output<<"value of object output:"<<s1.var_a<<endl; 
    return output; 
} 

istream &operator >>(istream &input, overload &s1) 
{ 
    input >> s1.var_a; 
    return input; 
} 

int main() 
{ 
    overload s1,s2; 
    //ostream obj; 
    //obj<<"enter the value of object" 
    cout<<"enter the value of object"; 
    cin>>s2; 
    cout<<s2; 

    return 1; 
} 
+1

如果你想輸出到屏幕上,爲什麼你只是不使用'std :: cout',就像你在例子中那樣?你想用'std :: ostream obj'做什麼?你想在哪裏「去」? – crashmstr

+0

您似乎對什麼是對象和什麼是功能感到困惑。 'ostream obj;'嘗試默認構造一個'ostream'類型的對象,這很可能會給你提供你正在談論的錯誤。 'operator >>'是一個函數,你不用「給它一個名字」,但是可以用諸如'cout'和's2'這樣的參數來調用它。 – jrok

+0

我用g ++運行這段代碼,它給出了輸出 –

回答

0

相關部分是ostream &的&。這使它成爲一個參考。

在你的main(),你其實可以做到:ostream& obj = std::cout;。就像operator<<中的ostream& output在該函數運行時有效,ostream& obj將在main函數運行時有效。

至於你的評論,這是缺少一個關鍵點。 std::coutstd::ostream,是的。但std::ofstream(文件)也是std::ostream。等等,你可能會說,一種是另一種類型?是的,用OO語言。繼承意味着每個對象都有用於構造它的類型,但也包含從其繼承的任何基類型。

這就是爲什麼你可以通過一個文件流到你的operator<<過載。 std::ostream&可以用任何派生對象初始化。

+0

好答案。在C++ 11編譯器中,編譯註釋代碼後,出現以下錯誤: c:\ mingw \ include \ C++ \ 4.9.0 \ ostream:384:7:error:'std :: basic_ostream <_CharT, _Traits> :: basic_ostream()[with _CharT = char; _Traits =標準:: char_traits ]」被保護 basic_ostream() 如果我沒有錯然後ostream的類的構造器似乎和下面的代碼段被保護也表明,仍然通過使用引用它可以由可能的,因爲它忽略了直接建設。 ostream&obj = std :: cout; obj <<「Hello World」; – user2907032

+0

@ user2907032:它並不真的「忽略」構造,它只是引用一個已經構建的對象(準確地說是'std :: cout')。 – MSalters

+0

感謝Msalters的評論。我很想知道通過看到錯誤信息,使這個類(istream和ostream)受到保護的原因是什麼。即使我能夠通過引用使主對象或朋友函數中的對象成爲對象。 – user2907032