2017-05-28 6 views
0

まあ、一般的に、目標は、関数内で、私のクラスのオブジェクト、またはcout | cin。istream、ostreamからクラスを正しく継承するには?

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

std :: ostreamから継承する必要はありません。あなたは通常、関数std :: ostream&operator <<(std :: ostream&os、MyType const & m); ' – Galik

+0

)をオーバーロードします。このポストはこれに使うことができます:https://stackoverflow.com/questions/37720431/what-is- -cc-equivalence-of-java -ioio-serializable/37721075#37721075 – Galik

+0

@ Galik通常のオーバーロードが機能するので、コンストラクタを使用して、 "mout"、 "min"、および標準スレッドで動作させることができます。 – Evgen8

答えて

1

あなたが発生している問題は、それらの両方がstd::streambuf*パラメータを必要とし、std::istreamstd::ostreamのいずれかには引数なしのコンストラクタがないです。したがって、Mystreamはデフォルトのコンストラクタを持つことができません。あなたはコンストラクタを書く必要があります。 std::fstreamおよびstd::stringstreamは、std::streambuf,std::filebufおよびstd::stringbufという関連サブクラスでこれを行います。私はあなたもstreambufサブクラスを提供することをお勧めします。

std::iostreamから継承されている可能性があります。すでに入力ストリームと出力ストリームを継承しています。私が言及したこれらの名前はすべて、std::basic_*<char, std::char_traits<char>>の型エイリアスです。簡単に一般化することができます。template <Char = char, Traits = std::char_traits<Char>> class MyStream : std::basic_iostream<Char, Traits>{ ... }

関連する問題