如何从istream,ostream正确继承我的类?

时间:2017-05-28 20:12:15

标签: c++

嗯,总的来说,目标就是在函数中可以传输我的类的对象,或者cout | CIN。

MyStream mout = MyStream();
MyStream min = MyStream();
...
static int UShowTFileList(ostream& out, istream& in);
...
UShowTFileList(cout, cin);
UShowTFileList(mout,min);

显而易见的解决方案不起作用。没有构造函数。

class MyStream : public ostream, public istream {...}
...
MyStream mout = MyStream();
MyStream min = MyStream();
...
-->
Error (active)  E1790   the default constructor of "MyStream" cannot be referenced -- it is a deleted function

嗯,所有挑战也是如此。

mout << "Hello, world!" << "\n";
->
Error   C2280   'MyStream::MyStream(const MyStream &)': attempting to reference a deleted function

一般来说,如何正确继承istream,ostream? MyStream.h

1 个答案:

答案 0 :(得分:2)

您遇到的问题是std::ostreamstd::streambuf*都没有无效的构造函数,它们都需要Mystream参数。因此std::fstream不能有默认的构造函数,你必须编写一个。 std::stringstreamstd::streambuf使用std::filebufstd::stringbufstd::iostream的相关子类执行此操作。我建议你也提供一个streambuf子类。

请注意,您也可以继承std::basic_*<char, std::char_traits<char>>,它已经是一个组合的输入/输出流。另请注意,我提到的所有这些名称都是template <Char = char, Traits = std::char_traits<Char>> class MyStream : std::basic_iostream<Char, Traits>{ ... }的类型别名,您可以轻松地推广到/** * @param User $user * @param String $column * @return array */ public function getStatsByDQL(User $user, String $column) { $midNight = date_create('00:00:00')->format('Y-m-d H:i:s'); $em2 = $this->getDoctrine()->getManager()->getRepository('AppBundle:ExerciseStats') ->createQueryBuilder('g') ->setParameters(array( 'user' => $user, 'column' => $column, 'date' => $midNight, )) ->where('user = :user', 'g.timestamp < :date', 'column = :column') ->select('g.column') ->setMaxResults(1) ->join('g.user', 'user') ->orderBy('g.column','DESC') ->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); return $em2;