2013-10-22 79 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