2012-04-09 15 views
9

coutがostreamクラスのオブジェクトである場合、同じクラスから独自のオブジェクト、たとえば 'out'を宣言できないのはなぜですか?すなわち、動作するはずの次のコードはありませんか?独自のostreamオブジェクトを作成できないのはなぜですか?

#include<iostream> 
using namespace std; 
int main() 
{ 
    ostream out; 
    out<<"something"; 
} 

あるいは

#include<iostream> 
using namespace std; 
int main() 
{ 
    ostream_withassign out; 
    out<<"something"; 
} 
+1

どうすればよいですか?アウトプットはどこに行きますか? –

+3

'ostream_withassign'とは何ですか? – jrok

+0

なぜそれはできないと思いますか? –

答えて

0

もちろん、あなたがそれを使用することができない、(このストリーム出力がに何をするか)のostreamオブジェクトを設定しませんでした。 http://www.cplusplus.com/reference/iostream/ostream/ostream/
すなわち

// ostream constructor 
#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 
    filebuf fb; 
    fb.open ("test.txt",ios::out); 
    ostream os(&fb); 
    os << "Test sentence\n"; 
    fb.close(); 
    return 0; 
} 
+0

coutのように出力を標準出力に送るにはどうしたらいいですか? – user1232138

+0

@user - OS固有の知識を使用することはできません。それで、私たちはすでに標準ライブラリに 'cout'を持っています。 –

+1

@ user1232138 'ostream'から派生し、' cout's 'rdbuf()'をostreamのコンストラクタパラメータとして渡すことができます。しかし、それが良いアイデアかどうかは分かりません。 – jrok

5

ストリームオブジェクトは、外部装置にデータを送信するためのバッファを必要とします。標準出力ストリームオブジェクトstd::coutは、出力が表示される場所にトランスポートをカプセル化するバッファで初期化されます。ここでは不自然な例です:

std::ostream cout(/* buffer */); 

標準ストリームオブジェクトになりすまし、独自のストリームオブジェクトを作成するには、単にそのコンストラクタにstd::coutのバッファを渡すことができます。

std::ostream copy(std::cout.rdbuf()); // Note: not a *real* copy 

copy << "Hello World"; 
0

のostreamクラスはIOSクラスから派生した:私は実際にこれをやってお勧めしませんので注意してください。 iosクラスのコンストラクタは次のようになります。 IOSのデフォルトコンストラクタが保護されているので、あなたがのostreamのデフォルトコンストラクタを使用してオブジェクトを作成することはできません意味

public: explicit ios (streambuf* sb); 
protected: ios(); 

ostreamのオブジェクトを作成するために残された方法は、streambuf sb *引数を使用しています。

std::ostream my_obj(std::cout.rdbuf()); 

同様に、ostreamオブジェクトを値渡しすることはできません。

IOS

理由はios_base由来します。 そのコピーコンストラクタはプライベートです。

protected: ios_base();  
private: ios_base (const ios_base&); 
関連する問題