2010-09-02 32 views
13

Tôi muốn quá tải operator<< cho lớp học của mình. Tôi có nên thêm định nghĩa quá tải này vào không gian tên std không? (kể từ khi ostream operator<< là một phần của không gian tên std) Hoặc tôi nên để nó trong không gian tên chung?Trường hợp quá tải nhà điều hành không phải là thành viên sẽ được đặt ở đâu?

Nói tóm lại:

class MyClass { 

}; 

namespace std { 
    ostream& operator<< (ostream& Ostr, const MyClass& MyType) {} 
} 

HOẶC

class MyClass { 

}; 

std::ostream& operator<< (std::ostream& Ostr, const MyClass& MyType) {} 

Đó là thích hợp hơn và tại sao? Cảm ơn bạn đã trả lời trước.

Trả lời

25

Bạn nên đặt quá tải toán tử trong cùng một không gian tên như lớp của bạn.

Điều này sẽ cho phép người vận hành tìm thấy trong quá trình phân giải quá tải bằng cách sử dụng tra cứu phụ thuộc vào đối số (thực tế, vì ostream nằm trong không gian tên std, quá tải quá tải cũng sẽ được tìm thấy nếu bạn đặt nó trong không gian tên std, nhưng có không có lý do để làm điều đó).

Từ quan điểm của thực hành thiết kế tốt, quá tải của nhà điều hành là một phần của giao diện lớp học hơn giao diện của ostream, do đó nó thuộc cùng một không gian tên với lớp của bạn (xem thêm Namespaces and the Interface Principle của Herb Sutter).

Từ quan điểm viết mã tuân thủ tiêu chuẩn và mã di động, bạn không thể đặt quá tải toán tử vào không gian tên std. Trong khi bạn có thể thêm chuyên môn mẫu cho các thực thể do người dùng xác định vào không gian tên std, bạn không thể thêm quá tải hàm bổ sung.

+1

+1 Ngoài ra, liên kết bắt buộc: http://en.wikipedia.org/wiki/Argument-dependent_lookup –

+0

Câu cuối cùng có thực sự chính xác khi xem phản hồi của Sam và trích dẫn từ tiêu chuẩn hay không. – Chubsdad

+3

@chubsdad: Có, tôi nghĩ vậy: Bạn _can_ thêm chuyên môn; bạn _can't_ thêm quá tải. –

6

Không thêm vào không gian tên chuẩn. Lý do: Nếu mọi người đã làm điều này, không gian tên chuẩn sẽ có đống xung đột tên, điều này sẽ đánh bại mục đích của một không gian tên.

Mục tiêu của bạn là để lớp học của bạn trở thành "có thể có khả năng". Nó không cần phải ở trong không gian tên chuẩn để làm điều đó. Miễn là nó là trong bất cứ điều gì namepsace lớp học của bạn được khai báo trong, bạn đang sử dụng tốt. Đặt nó trong không gian tên chuẩn sẽ là thực hành không tốt.

+1

Nó đánh bại mục đích của không gian tên 'std', là mã thư viện chuẩn C++. Mã người dùng nào không. –

6

Không thêm nó vào không gian tên std, đặt nó trong cùng một không gian tên như lớp học của bạn. Mục đích của một không gian tên là ngăn chặn xung đột. Tiêu chuẩn nói

17.4.3.1 tên Reserved

Nó là undefined cho một chương trình C++ để thêm tuyên bố hoặc định nghĩa để namespace std hoặc không gian tên trong namespace std trừ trường hợp quy định . Một chương trình có thể thêm mẫu chuyên biệt cho bất kỳ mẫu thư viện chuẩn chuẩn nào vào không gian tên std. một chuyên môn hóa này (hoàn toàn hay một phần) của một tiêu chuẩn thư viện mẫu kết quả trong hành vi undefined trừ việc kê khai phụ thuộc vào một tên người dùng xác định mối liên hệ bên ngoài và trừ trường hợp chuyên môn đáp ứng các yêu cầu tiêu chuẩn thư viện cho bản gốc bản mẫu.

Các vấn đề liên quan