Próbuję podzielić kod z mojego oprogramowania symulacji C++ do biblioteki, aby można było go używać bardziej elastycznie. Symulacja opiera się na numerze Lattice
, składającym się z liczby Node
s, które przechowują listy wskaźników do ich Neighbor
s. . Chociaż sąsiedzi są również węzły, chciałbym mieć trochę klasy otoki wokół wskaźnika *Node
w celu realizacji dodatkowych logika/pola (np bool is_neares_neighbor
lub takKtóry wzorzec C++ jest używany w bibliotece, która umożliwia rozszerzanie jej klas?
Moja klasa architektura wygląda więc tak:
class Lattice {
private:
vector<Node> _nodes;
};
class Node {
private:
vector<Neighbor> _neighbors;
};
class Neighbor {
private:
Node * _node;
};
tak daleko, tak dobrze. teraz chciałbym moją bibliotekę do obsługi wszystkich logiki związanych kraty, ale nic innego. jednak podczas korzystania z biblioteki w jakimś projekcie, trzy klasy (Lattice
, Node
, Neighbor
) będzie mieć więcej logiki i pól, dlatego użytkownik powinien móc dziedziczyć z tych klas i realizować swój zwyczaj rzeczy, podczas gdy biblioteka nadal obsługuje wszystkie niezbędne logiki związane z siecią.
Jaki jest zalecany sposób na zrobienie tego? Czy szablony są tutaj odpowiednie? W matrycy sytuacji, moja klasa hierarchia będzie wyglądać następująco:
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;
};
Jak widać, zarówno Node
i Neighbor
trzeba znać typ siebie, która jest okrągła warunek nie mam pojęcia, jak sobie radzić tutaj. Ponadto cała biblioteka musiałaby żyć w plikach nagłówkowych.
Jak sytuacje takie jak te są rozwiązywane w świecie C++ w najbardziej elegancki sposób?
Co to są N i NN? Myślę, że mam rozwiązanie zadanego pytania, chociaż nadal miałbym pewne obawy dotyczące surowego wskaźnika do węzła wewnątrz sąsiada. –
Czy typy węzłów i sąsiadów są naprawdę całkowicie niezależne od siebie? Czy określony typ węzła nie implikuje określonego typu sąsiada? Mogłabym sobie wyobrazić Węzeł i Sąsiad jako abstrakcyjne klasy (interfejsy) i wyprowadzić z nich konkretne węzły i sąsiadów. Ale może źle się spełniłem. –
Hej, dziękuję wam za odpowiedź. @KennyOstrom: N i NN to klasy wywodzące się odpowiednio od 'Node' i' Neighbour', które są dostarczane przez użytkownika. Użytkownik może więc dodawać funkcje i zmienne zarówno do klasy "Węzeł", jak i "Sąsiada". @FrankPuffer: Nie są zależne. Wiele informacji meta może istnieć w związku między dwoma 'węzłami', jak liczniki, i tak dalej. Jest to relacja 1: n, w której można przechowywać dodatkowe informacje o relacji. Jest to jednak prawdopodobnie część, którą mogę łatwo zaoszczędzić, jeśli nie ma innego rozwiązania. Po prostu chcę, żeby była bardzo elastyczna. – janoliver