Tôi đã viết một lớp hoạt động như một trình lặp để phân tích các tệp được định dạng CSV. Tôi cũng đã viết các lớp khác để đọc các tệp csv cụ thể để điền trực tiếp cấu trúc MyObject. Vì vậy, các lớp có thể được sử dụng như thế (tôi loại bỏ các lỗi xử lý một phần của mã):là một điều tốt để sử dụng trình lặp để đọc trên luồng đã định dạng?
std::ifstream in(filename);
MyObjectParser parser(in);
MyObjectParser::Iterator it;
for (it = parser.begin(); it != parser.end(); it++)
{
MyObject b = *it;
// do some stuff here ...
}
chương trình này hoạt động tốt và tôi hài lòng với nó, nhưng tôi nhận ra rằng ý nghĩa tiềm ẩn (chỉ dành cho bản thân mình?) của một trình lặp là nó sẽ lặp qua bộ sưu tập. Trong trường hợp này không có bộ sưu tập mà là một luồng.
Tôi có nên muốn có một hình thức mà một cách rõ ràng cho thấy tôi đang sử dụng một dòng do quá tải >> điều hành và do đó có một cái gì đó như thế:
std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
// do the same "some stuff" here...
}
Là nó chỉ là vấn đề của hương vị? Tôi không thấy rõ sự khác nhau (ngoại trừ ở dạng thứ hai đối tượng chỉ được điền và không được sao chép) và hậu quả của việc chọn hình thức đầu tiên hoặc thứ hai là gì.
Tôi rất vui khi nhận được một số ý kiến khác để biết chính xác lý do tôi sử dụng giải pháp thay vì giải pháp khác.
Ai nói rằng trình lặp nên lặp qua * bộ sưu tập *? Sự hiểu biết của tôi là các trình vòng lặp lặp qua * cái gì đó *, * cái gì đó * là ** bất kỳ loại dữ liệu nào **, ví dụ một thùng chứa, một luồng (tệp, dữ liệu mạng, ...) hoặc thậm chí một số ngầm định (có thể là giả) dữ liệu. Giữ nó chung. ;) Cá nhân tôi thích giao diện dựa trên trình lặp của bạn. – leemes