2012-11-05 27 views
15

Tôi muốn làm ngược lại với việc tạo trường hợp của một lớp học noncopyable, nghĩa là đảm bảo rằng các phiên bản của một lớp cụ thể có thể được thông qua chỉ làm bản sao chứ không phải như một tham chiếu. Nếu bất kỳ hàm nào cố gắng nhận nó theo tham chiếu, tôi muốn nó cung cấp một lỗi biên dịch (lý tưởng) hoặc một lỗi thời gian chạy.Có thể không cho phép tham chiếu đến một đối tượng

Tôi không nghĩ rằng làm cho operator & riêng tư sẽ làm điều đó, là có một cách hợp pháp để làm điều này.

+2

Câu hỏi công bằng nhưng rất có thể là nếu bạn muốn thực hiện điều này, đó là dấu hiệu của thiết kế kém. Điều này sẽ cấm bạn từ bao thanh toán một chức năng lớn nếu đối tượng này được sử dụng trong suốt. – djechlin

+1

Ý tưởng thú vị, nhưng điều này về cơ bản sẽ giống như không cho phép một con trỏ đến loại đối tượng đó, và điều đó có vẻ khá không hợp lý với tôi. –

+0

@DanF không cho phép con trỏ tôi nghĩ dễ hơn. Làm cho '&' riêng tư nên làm điều đó. – san

Trả lời

7

Tôi không nghĩ rằng làm cho nhà điều hành & riêng tư sẽ làm điều đó, có cách hợp pháp để làm điều này không.

Không, vì số & bạn sử dụng trong chữ ký chức năng để chuyển qua tham chiếu không phải là toán tử. Bạn đang nói về địa chỉ của toán tử (unary) hoặc bitwise-and operator (binary). Vì vậy, nó không có gì để làm với pass-by-tham khảo.

Không có cách nào để không cho phép tham chiếu theo từng loại cho một loại.

tôi nghi ngờ động lực của bạn là đủ mạnh để làm điều này, và bạn dường như có một sự hiểu biết xấu của cơ chế qua:

Nếu bất kỳ chức năng cố gắng để nhận được nó bằng cách tham khảo, tôi muốn nó để cung cấp cho lỗi biên dịch (lý tưởng) hoặc lỗi thời gian chạy.

Một hàm hoặc chuyển tham số theo tham chiếu hoặc theo giá trị. Nó được quyết định bởi tuyên bố của nó, và tôi nghĩ rằng sự nhầm lẫn của bạn bắt nguồn từ đây. Ví dụ:

void foo(X x); 

lấy tham số x theo giá trị. Không có cách nào để vượt qua nó bằng cách tham khảo. Không đời nào. Tương tự:

void foo(X& x) 

mất theo tham chiếu và sẽ luôn như vậy.

+0

cảm ơn điều đó hữu ích – san

17

Điều đó là không thể. Bất kỳ biến được đặt tên nào cũng có thể liên kết với biến tham chiếu thuộc loại thích hợp. Đó là cách ngôn ngữ hoạt động.

Cụ thể, bạn không bao giờ có thể có một nhà xây dựng bản sao sao chép với giới hạn của mình, vì vậy bạn không thể chuyển đối tượng theo giá trị!

+3

+1 cho lý do. –

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