2012-04-09 88 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

它會做什麼?產出會在哪裏? – 2012-04-09 10:14:06

+3

'ostream_withassign'應該是什麼? – jrok 2012-04-09 10:15:10

+0

你爲什麼認爲這是不可能做到的? – 2012-04-09 10:16:57

回答

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 2012-04-09 10:27:59

+0

@user - 我們不能沒有使用一些操作系統特定的知識。這就是爲什麼我們已經在標準庫中擁有'cout'的原因。 – 2012-04-09 10:37:04

+1

@ user1232138你可以從'ostream'派生出來,並通過'cout'''rdbuf()'作爲ostream的構造函數參數。不過,我不確定這是否是一個好主意。 – jrok 2012-04-09 10:37:31

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類的構造函數如下所示。

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

這意味着默認的ios構造函數被保護,因此您不能使用默認的ostream構造函數創建對象。

只剩下創建ostream對象的方法是使用streambuf sb *參數。

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

同樣,您不能通過值傳遞ostream對象。

原因

IOS從的ios_base的。 它的拷貝構造函數是私有的。

protected: ios_base();  
private: ios_base (const ios_base&); 
相關問題