2016-02-15 11 views
5

Tôi đang cố gắng tách một số mã khỏi phần mềm mô phỏng C++ của tôi thành một thư viện, vì vậy nó có thể được sử dụng linh hoạt hơn. Mô phỏng dựa trên Lattice, bao gồm một số Node s chứa danh sách các con trỏ tới số Neighbor s của chúng. . Mặc dù các nước láng giềng cũng được các nút, tôi muốn có một chút lớp bao bọc xung quanh con trỏ *Node để thực hiện thêm logic/lĩnh vực (ví dụ, bool is_neares_neighbor hoặc lâu hơnMẫu C++ nào để sử dụng cho thư viện cho phép mở rộng các lớp của nó?

kiến ​​trúc lớp của tôi do đó trông giống như sau:

class Lattice { 
private: 
    vector<Node> _nodes; 
}; 

class Node { 
private: 
    vector<Neighbor> _neighbors; 
}; 

class Neighbor { 
private: 
    Node * _node; 
}; 

cho đến nay, như vậy tốt. Bây giờ, tôi muốn thư viện của tôi để xử lý tất cả các logic mạng liên quan đến, nhưng không có gì khác. Tuy nhiên, khi sử dụng thư viện trong một số dự án, ba lớp (Lattice, Node, Neighbor) sẽ mang nhiều logic và trường hơn, do đó người dùng có thể kế thừa từ các lớp này và thực hiện tùy chỉnh của mình công cụ, trong khi thư viện vẫn xử lý tất cả logic liên quan đến mạng tinh thể cần thiết.

Cách được khuyến nghị để làm điều đó là gì? Các mẫu có phù hợp ở đây không? Trong một tình huống templated, hệ thống cấp bậc lớp học của tôi sẽ trông như thế này:

template<class N> 
class Lattice { 
private: 
    vector<N> _nodes; 
}; 

template<class NN> 
class Node { 
private: 
    vector<NN> _neighbors; 
}; 

template<class N> 
class Neighbor { 
private: 
    N * _node; 
}; 

Như bạn có thể thấy, cả hai NodeNeighbor cần phải biết loại lẫn nhau, đó là một điều kiện tròn Tôi không có ý tưởng làm thế nào để đối phó với Đây. Ngoài ra, toàn bộ thư viện sẽ phải sống trong các tệp tiêu đề.

Các tình huống như thế nào được xử lý trong thế giới C++ theo cách thanh lịch nhất?

+0

N và NN là gì? Tôi nghĩ rằng tôi có một giải pháp cho câu hỏi như được hỏi, mặc dù tôi vẫn sẽ có một số mối quan tâm về con trỏ nguyên đến nút bên trong hàng xóm. –

+0

Các loại Node và Neighbor có thực sự hoàn toàn độc lập với nhau không? Không phải một loại Node cụ thể ngụ ý một loại hàng xóm cụ thể? Tôi sẽ tưởng tượng Node và Neighbor là các lớp trừu tượng (các giao diện) và lấy các nút và hàng xóm cụ thể từ chúng. Nhưng có lẽ tôi đã nhận được yêu cầu của bạn sai. –

+0

Xin chào, cảm ơn cả hai vì đã trả lời. @KennyOstrom: N và NN là các lớp bắt nguồn từ 'Node' và' Neighbor', tương ứng, được cung cấp bởi người dùng. Vì vậy, người dùng có thể thêm các hàm và biến vào cả lớp 'Node' và' Neighbor'. @FrankPuffer: Chúng không phụ thuộc. Rất nhiều thông tin meta có thể tồn tại trong một mối quan hệ giữa hai 'Node', giống như các bộ đếm, v.v. Nó giống như mối quan hệ 1: n, nơi có thể lưu thêm thông tin về mối quan hệ. Tuy nhiên, đây có lẽ là phần tôi có thể dễ dàng nhất, nếu không có giải pháp nào khác. Tôi chỉ muốn làm cho nó rất linh hoạt. – janoliver

Trả lời

1

Tôi nghĩ bạn muốn loại mẫu là "một số loại khác" mà thư viện mạng của bạn không biết hoặc không quan tâm. Vì vậy, thay vì để người dùng lấy được từ Node, thay vào đó bạn sử dụng mẫu < lớp t_data > cho tất cả các lớp của bạn.

Bạn tự nói, Hàng xóm là nút, vì vậy bạn có thể xác định mọi thứ theo Node <t_data>.

Bạn cũng nên xem xét cách bạn sẽ xây dựng mạng tinh thể và cách bạn sẽ trả về thông tin về mạng đó. Dưới đây là một ví dụ mà tôi giả sử bạn tạo ra mạng bằng cách có lớp mạng tạo ra các nút, với tùy chọn kết nối chúng với các nút hiện có tại thời điểm tạo.

#include <vector> 
#include <memory> 

template<class t_data> 
class SetOfNodes; 

template<class t_data> 
class Node { 
public: 
    Node(t_data value, SetOfNodes neighbors) : _data(value), _neighbors(neighbors) {} 
    is_nearest_neighbor(const Node &other){ 
     // is other in _neighbors? 
     // is other the closest neighbor? 
     return false; 
    } 
private: 
    t_data _data; 
    SetOfNodes _neighbors; 
}; 

template<class t_data> 
class SetOfNodes { 
public: 
    std::vector<std::shared_ptr<Node<t_data>>> _nodes; 
}; 

template<class t_data> 
class Lattice { 
public: 
    SetOfNodes get_all_nodes(); 
    void create_new_node(SetOfNodes neighbors); 
private: 
    SetOfNodes _nodes; 
}; 

Tôi không thực sự hiểu Hàng xóm, bởi vì đó là nút hoặc liên quan đến hai nút, vì vậy tôi sẽ để lại một mình.

+0

về mặt kỹ thuật, các nút của bạn không có bất kỳ loại nào, nhưng tôi cho rằng điểm của thư viện này là làm việc với một số loại khác, và đó là lý do bạn đề cập đến mẫu –

+0

Xin chào Kenny, cảm ơn vì đề xuất của bạn. Đề xuất của bạn dường như sử dụng một số loại cấu trúc dữ liệu bổ sung, mà chỉ đơn giản là được thêm vào các lớp thư viện của tôi là thành viên, trong khi thư viện tự làm việc với các kiểu riêng của nó. Tôi sẽ thử điều đó sau. Đó là một chút ít thanh lịch hơn tôi nghĩ rằng tôi có thể giải quyết điều này, trong đó người dùng buộc phải xác định một lớp như vậy và không thể sử dụng thư viện mà không có nó, nhưng có lẽ nó sẽ làm. – janoliver

+0

Không có câu trả lời nào thực sự phù hợp với yêu cầu của tôi, đó là lý do tại sao tôi quyết định không tạo một thư viện độc lập về các công cụ mạng. Câu trả lời này sẽ là lựa chọn tốt nhất, vì vậy tôi sẽ đánh dấu nó là chính xác. – janoliver

0

tôi sẽ khuyên bạn nên sử dụng một sự kết hợp của mô hình composite/Lượt truy cập:

  • composite sẽ giúp bạn xác định một hệ thống các lưới/Node Neighbor/classes/Custom_User_Node_Derived có thể được điều trị thống nhất (bất kể nội dung là)
  • Khách truy cập sẽ giúp bạn thu thập thông tin phân cấp và đóng gói logic cho lớp Lattice/Node/Neighbor của bạn cũng như cho phép người dùng xác định các hoạt động mới mà bạn chưa thực sự dự đoán được.

Đó là một cách tiếp cận đặc biệt được khuyến nghị khi bạn muốn mở rộng thư viện (hoặc tập hợp các lớp) mà bạn không có quyền kiểm soát. Từ sự hiểu biết của tôi đó là một trong những điều bạn muốn người dùng của bạn có thể.

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