Giả sử tôi có hai loại đối tượng, A và B. Mối quan hệ giữa chúng là nhiều đối tượng, nhưng cả hai đều không phải là chủ sở hữu của đối tượng kia.
Cả hai trường hợp A và B cần phải biết về kết nối; nó không chỉ là một cách.
Vì vậy, chúng ta có thể làm điều này:
class A
{
...
private: std::vector<B *> Bs;
}
class B
{
private: std::vector<A *> As;
}
Câu hỏi của tôi là: nơi tôi đặt các chức năng để tạo và phá hủy các kết nối?
Nó có nên là A :: Đính kèm (B), sau đó cập nhật A :: Bs và B :: dưới dạng vectơ?
Hoặc nên là B :: Đính kèm (A), có vẻ hợp lý như nhau.
Không ai trong số họ cảm thấy đúng. Nếu tôi ngừng làm việc với mã và quay lại sau một tuần, tôi chắc chắn tôi sẽ không thể nhớ lại nếu tôi nên làm A.Attach (B) hoặc B.Attach (A).
Có lẽ nó nên là một chức năng như thế này:
CreateConnection(A, B);
Nhưng việc tạo ra một hàm toàn cầu dường như cũng không mong muốn, vì đó là một hàm đặc biệt chỉ làm việc với các lớp A và B.
Một câu hỏi khác: nếu tôi gặp phải vấn đề / yêu cầu này thường xuyên, bằng cách nào đó tôi có thể đưa ra giải pháp chung cho nó không? Có lẽ một lớp TwoWayConnection mà tôi có thể rút ra hoặc sử dụng trong các lớp có chung mối quan hệ này?
Một số cách tốt để xử lý tình huống này là gì ... Tôi biết cách xử lý tình huống "C sở hữu D" một-nhiều khá tốt, nhưng cách này là khó khăn hơn.
Chỉnh sửa: Chỉ để làm cho nó rõ ràng hơn, câu hỏi này không liên quan đến vấn đề sở hữu. Cả A và B đều thuộc sở hữu của một số đối tượng Z khác và Z xử lý tất cả các vấn đề về quyền sở hữu. Tôi chỉ quan tâm đến cách tạo / xóa liên kết nhiều-nhiều giữa A và B.
Pointer
và GestureRecognizer
. Con trỏ được sở hữu và quản lý bởi lớp InputManager. GestureRecognors được sở hữu bởi các phiên bản Widget, được sở hữu bởi một phiên bản Màn hình được sở hữu bởi một phiên bản Ứng dụng. Các con trỏ được gán cho GestureRecognators để chúng có thể cung cấp dữ liệu đầu vào thô cho chúng, nhưng GestureRecognifier cần phải biết có bao nhiêu con trỏ hiện đang được liên kết với chúng (để phân biệt 1 ngón tay với 2 cử chỉ ngón tay, v.v.).