Hoặc:
std::ostream &o = condition ? std::cout : file;
hoặc nếu có mã trong giữa hai đoạn mã của bạn:
std::ostream *op = &std::cout;
// more code here
if (!condition) {
op = &file;
}
std::ostream &o = *op;
Vấn đề không phải là đặc biệt để làm với lớp trừu tượng, đó là các tham chiếu không thể được reseated.
Ý nghĩa của biểu thức o = file
không phải là "làm o
tham khảo file
", nó được "sao chép giá trị của file
vào referand của o
". May mắn cho bạn, std::ostream
không có operator=
và do đó không thể biên dịch và std::cout
không được sửa đổi. Nhưng hãy xem xét điều gì xảy ra với một loại khác:
#include <iostream>
int global_i = 0;
int main() {
int &o = global_i;
int file = 1;
o = file;
std::cout << global_i << "\n"; // prints 1, global_i has changed
file = 2;
std::cout << o << "\n"; // prints 1, o still refers to global_i, not file
}
Nguồn
2011-08-02 09:27:49
Vấn đề này là nhiều hơn về việc tham chiếu lại so với std :: ostream, tôi khuyên bạn nên thay đổi tiêu đề. Bởi vì câu hỏi là một câu hỏi hay. – daramarak
Bạn cần hiểu tham chiếu trong C++ chỉ có nghĩa là một bí danh. Vì vậy, khi tài liệu tham khảo đã được khởi tạo, bất kỳ toán tử thêm nào = để nó có nghĩa là chỉ thay đổi mục gốc mà tham chiếu đã đề cập đến. Một ví dụ tốt có thể được tìm thấy trong câu trả lời của Steve dưới đây. – Gob00st