2012-04-09 46 views
9

Nếu cout là một đối tượng của lớp ostream, thì tại sao chúng ta không thể khai báo đối tượng của chính mình, nói 'out' từ cùng một lớp. tức là, không phải mã sau đây phải hoạt động?Tại sao chúng ta không thể tạo đối tượng ostream của chúng ta

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

hoặc

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

Nó sẽ làm gì? Sản lượng sẽ đi đâu? –

+3

'ostream_withassign' nghĩa là gì? – jrok

+0

tại sao bạn nghĩ rằng không thể làm được? –

Trả lời

0

Bạn đã không thiết lập các đối tượng ostream (những gì hiện ra dòng này để), tất nhiên bạn không thể sử dụng nó. http://www.cplusplus.com/reference/iostream/ostream/ostream/
ví dụ:

// 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

Làm thế nào chúng ta có thể làm cho mã này để gửi đầu ra đến đầu ra tiêu chuẩn giống như cout không? – user1232138

+0

@user - Chúng tôi không thể sử dụng một số kiến ​​thức cụ thể về hệ điều hành. Đó là lý do tại sao chúng tôi đã có 'cout' trong thư viện chuẩn. –

+1

@ user1232138 Bạn có thể lấy được từ 'ostream' và truyền' cout's 'rdbuf()' làm tham số hàm tạo của ostream. Tôi không chắc đó là một ý hay hay không. – jrok

5

đối tượng Stream đòi hỏi một bộ đệm để gửi dữ liệu đến thiết bị bên ngoài. Đối tượng luồng đầu ra tiêu chuẩn, std::cout, được khởi tạo bằng bộ đệm đóng gói vận chuyển đến bất cứ nơi nào đầu ra của bạn xuất hiện. Dưới đây là một ví dụ contrived:

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

Để làm cho đối tượng luồng của riêng bạn mà giả vờ là các đối tượng dòng tiêu chuẩn, bạn có thể dễ dàng vượt qua bộ đệm của std::cout khởi dựng của nó. Lưu ý rằng tôi sẽ không khuyên bạn làm điều này trong thực tế:

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

copy << "Hello World"; 
0

ostream lớp có nguồn gốc từ ios lớp. Constructor của lớp ios trông giống như dưới đây.

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

Nghĩa là hàm tạo mặc định của ios được bảo vệ và do đó bạn không thể tạo đối tượng bằng cách sử dụng hàm tạo mặc định của luồng.

Cách duy nhất để tạo đối tượng ostream đang sử dụng đối số streambuf sb *.

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

Tương tự, bạn không thể chuyển đối tượng ostream theo giá trị.

Lý do

ios có nguồn gốc từ ios_base. Trình tạo bản sao của nó là riêng tư.

protected: ios_base();  
private: ios_base (const ios_base&); 
Các vấn đề liên quan