2017-02-12 17 views
5

Tôi có thời gian khó hiểu sự giải thích từ stroustrup cho những gì khó khăn một trong những phải có phải đối mặt, nếu nhà điều hành quá tải cho '.' đa được phep.Không có khả năng quá tải Dot '.' nhà điều hành trong c + +

Xem trích dẫn này từ Bjarne Stroustrup:

điều hành. (dot) về nguyên tắc có thể bị quá tải bằng cách sử dụng kỹ thuật tương tự như được sử dụng cho ->. Tuy nhiên, làm như vậy có thể dẫn đến các câu hỏi về việc liệu một hoạt động có nghĩa là đối với quá tải đối tượng hay không. hoặc một đối tượng được nhắc đến bởi. Ví dụ:

class Y { 
public: 
    void f(); 
    // ... 
}; 

class X { // assume that you can overload . 
    Y* p; 
    Y& operator.() { return *p; } 
    void f(); 
    // ... 
}; 

void g(X& x) 
{ 
    x.f(); // X::f or Y::f or error? 
} 

Trong ví dụ trên lý do tại sao không nên có bất kỳ sự nhầm lẫn trong khi thực hiện x.f()?

Y& operator.() { return *p; } 

Dưới đây là những gì tôi nghĩ:.

  1. điều hành() được gọi trên x do đó isnt nó obivous và trực quan mà Y& operator.()(return *p; } nên được gọi là?
  2. Khi trở *p trỏ tới đối tượng của loại Y và do đó Y::f() nên được gọi là cuối cùng (không X::f())

am i thiếu gì trong lời giải thích của stroustup? Tại sao nó không đơn giản?

+0

"do đó' Y :: f() 'nên được gọi cuối cùng" Nhưng không phải là điều khó hiểu với người đọc mã đó? Thông thường 'x.f()' sẽ gọi thành viên 'f' là' x', nhưng trong trường hợp này không xảy ra. –

+0

@ScottHunter Vâng, nếu ví dụ là từ Stroustrup và phải minh họa sự nhầm lẫn, không nên nhầm lẫn :)? – AlexD

+0

Câu hỏi [SO này] (http://stackoverflow.com/questions/520035/why-cant-you-overload-the-operator-in-c) nói về cùng một vấn đề. –

Trả lời

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