如何实现'虚拟ostream& print(ostream& out)const;'

时间:2009-07-01 14:12:19

标签: c++

我在抽象类的头文件中找到了这个函数:

virtual ostream & print( ostream & out ) const;

任何人都可以告诉我这是什么类型的功能以及如何在派生类中声明它? 据我所知,看起来它会返回对流出的引用。

如果我在我的cc文件中实现它没有任何内容,我会收到编译器错误:

error: expected constructor, destructor, or type conversion before ‘&’ token

有人能告诉我如何使用它的简单实现吗?

3 个答案:

答案 0 :(得分:2)

您可能忘记包含iostream,这使ostream可见。您还需要将其更改为std::ostream,因为C ++标准库名称位于名称空间std内。

  

在标题文件中写using namespace std;

如果你愿意,可以将它放入实现文件中,或者如果你为朋友写了一个例子。因为任何包含该标题的文件都会将所有标准库视为全局名称,这是一个巨大的混乱并且闻起来很多。它突然增加了与其他全球名称或其他using名称冲突的机会 - 我会避免使用指令(参见Herb Sutter的Using me)。所以将代码更改为这个

#include <iostream>
// let ScaryDream be the interface
class HereBeDragons : public ScaryDream {
    ...
    // mentioning virtual in the derived class again is not
    // strictly necessary, but is a good thing to do (documentary)
    virtual std::ostream & print( std::ostream & out ) const;
    ...
}; 

并在实现文件(“.cpp”)

#include "HereBeDragons.h"

// if you want, you could add "using namespace std;" here
std::ostream & HereBeDragons::print( std::ostream & out ) const {
    return out << "flying animals" << std::endl;
}

答案 1 :(得分:1)

#include <iostream>
using namespace std;

struct A {
  virtual ostream & print( ostream & out ) const {
      return out << "A";
  }
};

通常将打印功能设为虚拟,因为&lt;&lt;通常用于流输出的运算符不能这样(因为它不是成员函数)。

答案 2 :(得分:1)

一些实施:

ostream& ClassA::print( ostream& out) const
{
    out << myMember1 << myMember2;
    return out;
}

返回相同的ostream允许像

这样的组合
a.print( myStream) << someOtherVariables;

然而,以这种方式使用它仍然很奇怪。

关于错误,ostream是std命名空间的一部分,而不是全局命名空间或命名空间的一部分,您引用的类是其中的一部分。