2010-12-13 4 views
7

Chức năng getlinecharacter version là chức năng thành viên, cũng như global version có chuỗi. Tại sao cả hai đều không hoạt động? Cách hiện tại làm cho nó có vẻ như là không có một phiên bản chuỗi.Tại sao phiên bản chuỗi của getline là một hàm không phải là thành viên?

+0

Mặc dù ban đầu nó có thể phản trực giác, nhưng các tác giả hỗ trợ ý tưởng rằng cách hướng đối tượng nhất để thêm chức năng vào một lớp là bằng các hàm miễn phí. Đọc qua [Guru of the Week # 84] này (http://www.gotw.ca/gotw/084.htm). Câu hỏi có thể chuyển thành, * tại sao một số hàm thành viên thư viện hiện tại không có chức năng miễn phí? * –

Trả lời

5

istream& istream::getline(char* s, streamsize n) là một phần của giao diện luồng.

istream& getline(istream& is, string& str) là một phương thức mở rộng từ thư viện string (giống như istream &operator>>(istream&, string&)).

Thiết kế này có thể được chọn để tách iostreams từ chuỗi, như fstream::open() cũng không mất std::string lập luận mà là const char*.

2

Do việc triển khai các lớp iostream không nên phụ thuộc vào chuỗi.

1

Sự cố với thư viện luồng là nó không được thiết kế tốt. Đặc biệt, chức năng thành viên getline không nên có ở đó. Các chức năng miễn phí getline là ông phải một để sử dụng, nó có một số lợi thế: nó không phải là một chức năng thành viên, nó an toàn, không làm việc trên bộ đệm nguyên, và không đòi hỏi phỏng đoán.

Cần phải đề cập rằng cả hai hàm thành viên và miễn phí đều là một phần của giao diện công khai istream.