2010-10-27 5 views
5

Giả sử tôi tạo một lớp giống như một mảng char. Bây giờ, những gì hành xử lý này:Câu hỏi về nhà điều hành ostream <<

myClass inst; 
cout << inst; 

Tại "cout < < inst;" cái gì được gọi, chỉ đơn giản là tên của lớp? Cảm ơn.

+6

Toán tử < Shog9

+0

Tricky one: D. Bạn đã cho tôi ở đó :-D. Haha. Cảm ơn bạn. Vì vậy, câu hỏi ban đầu của tôi là câm như mọi khi, vì không cần phải có một "giá trị trả về" phổ quát, bạn có thể xác định nó với mọi toán tử bao gồm toán tử dịch chuyển nhị phân ... Tôi có đúng không? –

+0

Người đàn ông hoàn hảo, cảm ơn bạn. –

Trả lời

12

Gọi là std::ostream &operator<<(std::ostream &, myClass const &). Bạn có thể quá tải này nếu bạn muốn.

2

Trình biên dịch sẽ tìm kiếm tình trạng quá tải operator<<. Đặc biệt, nó sẽ tìm kiếm hoặc là một tình trạng quá tải thành viên-chức năng của std::ostream (sẽ không tồn tại), hoặc một chức năng miễn phí, mà bạn nên quá tải với nguyên mẫu sau:

std::ostream &operator<< (std::ostream &os, const myClass &x); 

Bạn có thể cần phải thực hiện một này người bạn của myClass nếu bạn cần truy cập các thành viên được bảo vệ/riêng tư.

2

Điều này dẫn đến lỗi trình biên dịch, trừ khi bạn có toán tử định kiểu quá tải cho một số loại mà ostream biết. Bạn có thể thêm các loại của riêng bạn vào các loại mà ostream biết bằng cách quá tải toàn cầu ostream& operator(ostream& os, const myClass& x) hoặc làm cho kiểu của bạn chuyển đổi thành chuỗi/int, v.v. Hãy cẩn thận, quá tải typecast có thể bắn bạn vào chân và được coi là một thực hành không tốt.

Cách đơn giản nhất là chỉ cần in một số biến từ lớp học của bạn:

myClass inst; 
cout << inst.getName() << ": " << inst.getSomeValue(); 
1

Để có thể sử dụng std::cout << someClass, bạn phải tạo một nhà điều hành như sau:

std::ostream &operator<< (std::ostream &, const someClass &); 
4

Bằng cách tạo ra một người bạn toán tử đầu ra, như trong ví dụ sau.

#include <iostream> 

class MyClass { 
    friend std::ostream & operator<<(std::ostream &out, const MyClass &inst); 
public: 
    // ... public interface ... 
private: 
    char array[SOME_FIXED_SIZE]; 
}; 

std::ostream & operator<<(std::ostream &out, const MyClass &inst) 
{ 
    out.write(inst.array, SOME_FIXED_SIZE); 
    return out; 
} 

Vui lòng không đưa ra giả định về ý nghĩa của "mảng char", đơn giản hóa nếu mảng char của bạn thực sự là nul (0 ký tự) chấm dứt.

Cập nhật: Tôi sẽ nói đây không phải là một giá trị trả về đúng cho lớp, mà đúng hơn là biểu diễn văn bản của lớp - bạn được tự do xác định.

+0

Không phải là chức năng của bạn bè, nhưng sau đó bạn phải thêm một phương thức chức năng công cộng khác vào lớp, điều này thực sự sẽ in các giá trị (hoặc bất kỳ thứ gì) vào luồng. –

+0

Có thể tất cả thông tin cần thiết để in đối tượng có sẵn trong các chức năng công cộng. 'Toán tử <<()' phải nằm ngoài lớp (vì đối số đầu tiên không phải là kiểu lớp). Nó có thể là một 'người bạn', nếu nó nhận được tất cả thông tin của nó từ giao diện lớp công khai. Nó có thể gọi một chức năng thành viên để thực hiện việc in ấn, và đôi khi đây là một ý tưởng tốt. –

+0

@VJo + @David - vâng tôi hoàn toàn đồng ý rằng nó không cần phải là chức năng của bạn bè nếu bạn có thể thu thập tất cả thông tin từ giao diện công khai. –