Sto cercando di dividere il codice dal mio software di simulazione C++ in una libreria, in modo che possa essere utilizzato in modo più flessibile. La simulazione si basa su un Lattice
, costituito da un numero di Node
s che contengono elenchi di puntatori ai loro Neighbor
s. . Anche se i vicini sono nodi anche, mi piacerebbe avere un po 'di classe wrapper intorno al puntatore *Node
al fine di attuare ulteriori logiche/campi (ad esempio, o almeno così bool is_neares_neighbor
Quale pattern C++ usare per una libreria che consente di estendere le sue classi?
mia architettura di classe sembra dunque qualcosa di simile:
class Lattice {
private:
vector<Node> _nodes;
};
class Node {
private:
vector<Neighbor> _neighbors;
};
class Neighbor {
private:
Node * _node;
};
Fin qui, tutto bene. Ora, vorrei la mia libreria per gestire tutta la logica reticolare-correlati, ma nient'altro. Tuttavia, quando si utilizza la libreria in qualche progetto, le tre classi (Lattice
, Node
, Neighbor
) porterà più logica e campi. L'utente dovrebbe quindi essere in grado di ereditare da queste classi e attuare la sua abitudine roba, mentre la libreria gestisce ancora tutta la logica necessaria relativa al reticolo.
Qual è il modo consigliato per farlo? I modelli sono appropriati qui? In una situazione su modelli, la mia gerarchia di classe sarebbe simile a questa:
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;
};
Come si può vedere, sia bisogno Node
e Neighbor
di conoscere il tipo di vicenda, che è una condizione circolare non ho idea di come affrontare con qui. Inoltre, l'intera libreria dovrebbe vivere nei file di intestazione.
Come si affrontano situazioni come queste nel mondo C++ nel modo più elegante?
Cosa sono N e NN? Penso di avere una soluzione alla domanda come chiesto, anche se avrei ancora qualche dubbio sul puntatore raw al nodo all'interno del prossimo. –
I tipi di nodi e di vicini sono completamente indipendenti l'uno dall'altro? Non un tipo specifico di Nodo implica un tipo specifico di Neighbor? Immaginerei Node e Neighbor come classi astratte (interfacce) e ricaviamo da loro i nodi concreti e i vicini. Ma forse ho sbagliato il tuo requisito. –
Ehi, grazie per aver risposto entrambi. @KennyOstrom: N e NN sono classi derivate rispettivamente da 'Node' e' Neighbor', che sono fornite dall'utente. Quindi l'utente può aggiungere funzioni e variabili alla classe 'Node' e' Neighbor'. @FrankPuffer: non sono dipendenti. Un sacco di meta-informazioni possono esistere in una relazione tra due 'Node', come contatori e così via. È come una relazione 1: n in cui è possibile memorizzare ulteriori informazioni sulla relazione. Tuttavia, questa è probabilmente la parte che posso risparmiare più facilmente, se non c'è altra soluzione. Voglio solo renderlo molto flessibile. – janoliver