【问题标题】:cin and cout redeclarationcin 和 cout 重新声明
【发布时间】:2013-10-22 12:26:34
【问题描述】:

我对 cin 和 cout object 的声明有疑问。根据我的理解 cin 和 cout 两个对象都可以在 main 中访问,那么它们不应该有 protected.in 下面的代码 sn-p 我已经重载了输入和输出运算符,并且 在为该运算符的用户定义版本提供新名称(ofstream obj)时,我收到错误,例如 obj 受保护且无法在此处访问。任何人都可以建议。

#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;
}

【问题讨论】:

  • 如果你想输出到屏幕上,你为什么不使用std::cout,就像你在你的例子中那样?你想用std::ostream obj 做什么?你想让它“去”哪里?
  • 您似乎对什么是对象和什么是函数感到困惑。 ostream obj; 尝试默认构造一个 ostream 类型的对象,这可能会给你你正在谈论的错误。 operator&gt;&gt; 是一个函数,你不要“给它一个名字”,而是用参数调用它,例如 couts2
  • 我在 g++ 中运行了这段代码,它给出了输出
  • 您的朋友声明与您的实际功能不完全匹配。
  • @aschepler:缺少&amp; 似乎是一个反复出现的问题。

标签: c++ operator-overloading


【解决方案1】:

相关部分是ostream &amp; 中的&。这使它成为一个参考。

在您的main() 中,您实际上也可以这样做:ostream&amp; obj = std::cout;。就像 operator&lt;&lt; 中的 ostream&amp; output 在该函数运行时有效一样,ostream&amp; objmain 函数运行时将有效。

[编辑] 至于您的评论,这缺少一个关键点。 std::coutstd::ostream,是的。但是std::ofstream(文件)也是std::ostream。等等,你可能会说,一种类型是另一种类型?是的,在 OO 语言中。继承意味着每个对象都有用于构造它的类型,但也有任何继承自的基类型。

这就是为什么您可以将文件流传递给您的operator&lt;&lt; 重载。 std::ostream&amp; 可以用任何派生对象初始化。

【讨论】:

  • 好答案。在 c++11 编译器中,编译注释代码后,出现以下错误: c:\mingw\include\c++\4.9.0\ostream:384:7: error: 'std::basic_ostream<_chart _traits> ::basic_ostream() [with _CharT = char; _Traits = std::char_traits]' is protected basic_ostream() 如果我没记错的话,ostream 类的构造函数似乎受到保护,下面的代码 sn-p 也表明仍然可以通过使用引用来实现,因为它直接忽略了建设。 ostream& obj= std::cout; obj
  • @user2907032:它并没有真正“忽略”构造,它只是引用了一个已经构造的对象(准确地说是std::cout。)
  • 感谢 Msalters 的评论。通过看到错误消息,我很想知道,使这些类(istream 和 ostream)受到保护的原因是什么。我仍然能够通过参考在 main 或朋友函数中获得这个对象。
  • @user2907032:它们是基类。它们是例如的常见部分。 ofstreamcout。这些共同的部分不能孤立存在,但可以单独使用
猜你喜欢
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2015-03-20
  • 2015-11-13
相关资源
最近更新 更多