2011-12-17 34 views
6

Tôi có mã này, nhưng nó không phải là một ví dụ thực tế.Mục đích của việc có thành viên lớp là loại ref là gì?

Ví dụ:

class Animal 
{ 
    int i; 
    int& ref; 
    public: 
    Animal() : ref(i) 
    { 
    } 
}; 

Bất kỳ ai cũng có thể đưa ra ví dụ về cuộc sống thực tế khi yêu cầu phải là thành viên của lớp để tôi có thể hiểu rõ hơn không?

+1

@pst: Điều đó hoàn toàn không liên quan. Tài liệu tham khảo C++ không thể được phục hồi, vì vậy việc sử dụng ví dụ về các tham chiếu có thể rebindable không thêm gì cả. –

+0

@BenVoigt Không * hoàn toàn * không có liên quan (hầu hết các loại tôi tạo tránh đột biến/có thành viên "chỉ đọc"). Bạn có một điểm rất hợp lệ mặc dù. –

+0

@ user966379, tôi nghĩ bạn cần phải thuật lại câu hỏi của bạn là "Mục đích của việc có một thành viên lớp là một kiểu ref tham chiếu đến một thành viên khác trong cùng một lớp?" Điều này sẽ giúp người tìm kiếm web trong tương lai. –

Trả lời

3

Bất kỳ khi nào nhiều đối tượng của một số lớp A đều cần tham chiếu đến một cá thể được chia sẻ duy nhất của cùng một hoặc một số lớp khác; Ví dụ, một số People có thể tất cả đều có cùng một mẹ và/hoặc cha:

class Person { 
    private: 
     Person &mother_; 
     Person &father_; 

    public: 
     Person(Person &mother, Person &father) : mother_(mother), father_(father) {} 
     // ... 
} 
+3

Vì lợi ích của OP, điều này được gọi là tập hợp, thường được sử dụng trong lập trình hướng đối tượng. –

+0

@ChrisParton Tôi sẽ không xem xét "tập hợp" này. Khi tôi nghĩ về "tổng hợp" trong ngữ cảnh OO, tôi nghĩ việc sử dụng nó như là một dạng mở rộng kiểu không sử dụng thừa kế - ví dụ: các phương thức cho đối tượng "tổng hợp" được proxy vào các đối tượng nội bộ/riêng tư (được "tổng hợp"). Trong trường hợp này, nó chỉ là vấn đề * không * tạo các đối tượng mới nhưng, thay vào đó, đề cập đến cùng một đối tượng "được chia sẻ". (Một người không "mở rộng" một người mẹ hoặc một người cha.) –

+1

Điều đó không giải thích tại sao bạn sẽ sử dụng tham chiếu * thay vì một con trỏ, vì các tham chiếu không thể được phục hồi và con trỏ có thể. Bằng cách sử dụng một tham chiếu, bạn đảm bảo rằng bạn phải có một hàm tạo bản sao. –

1

Chắc chắn: Toàn bộ mục đích của lớp mẫu std::reference_wrapper<T> là để giữ tham chiếu!

Điều này có nhiều công dụng. Ví dụ, bạn có thể chuyển nó tới hàm tạo std::thread (luôn tạo bản sao). Bạn cũng có thể tạo vùng chứa các trình bao bọc tham chiếu.

Giữ tham chiếu đến nội dung nào đó cũng có thể hữu ích khi bạn muốn bao bọc luồng đầu ra; bạn giữ luồng gốc làm tham chiếu và thêm mọi thứ vào luồng đó (ví dụ: this answer of mine có thể được cải thiện bằng cách thêm tham chiếu vào luồng cơ bản vào đối tượng bao bọc).

+0

Là std :: reference_wrapper C++ 11? Havent đọc toàn bộ tiêu chuẩn chưa –

1

Đó là về cơ bản giống như một con trỏ const. Nếu bạn cần một con trỏ không null đối với một số đối tượng khác và con trỏ đó sẽ chỉ được gán trong khi xây dựng, bạn có thể chọn sử dụng tham chiếu thay thế.

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