Domanda

In questo momento sto usando std :: pair per rappresentare un punto 2d in c ++. Tuttavia, mi sto seccando di dover scrivere

typedef std::pair<double, double> Point;

Point difference = Point(p2.first - p1.first,
                         p2.second - p1.second);

invece di essere in grado di sovraccaricare l'operatore + e l'operatore-.

Quindi, la mia domanda è, per rendere la mia classe Point, dovrei

  • Deriva pubblicamente da std :: pair e aggiungi le mie funzioni membro? Questo è carino perché tutto il mio codice può rimanere lo stesso. Non farò niente come std::pair<double, double>* p = new Point; quindi non devo preoccuparmi di cose come i distruttori virtuali.
  • Lancia la mia classe Point, il che è fastidioso poiché sto duplicando la funzionalità di std :: pair, tuttavia sono " facendolo nel modo puro " ;.
  • Crea specializzazioni template per operator + e operator- per std :: pair, che certamente non ricordo se vanno nei file sorgente o header.

Immagino che sia in discussione, mi piacerebbe davvero fare il numero 1, ma non so se sia una cattiva idea da quando ho sentito che ereditare da STL è un no-no.

È stato utile?

Soluzione

Potresti lanciare la tua propria classe Point, ma usa std :: pair internamente per memorizzare i dati. Ciò impedisce l'eredità dal problema STL, ma utilizza comunque la funzionalità std :: pair.

Altri suggerimenti

Meglio che lanciare il tuo: prendi una libreria Vector / Point gratuita esistente. Un consiglio: quello allegato a Essential Math for Games Programmers . Puoi utilizzare qualunque libreria trovi come punto di partenza, quindi ottimizzare / specializzare / modificare da lì.

Sarei a favore della creazione della propria classe Point e utilizzare l'eredità o la composizione privata se si desidera utilizzare la funzionalità di std :: pair. Il problema con il typedef (come sono sicuro che tu sia a conoscenza) è che qualsiasi funzione che scrivi che prende un punto sarà anche utilizzabile da qualsiasi cosa rappresentata come std :: pair & Lt; double, double & Gt; , che potrebbe non essere valido.

Con questo in mente, esiste un'altra opzione per la creazione di alcune funzioni del generatore gratuito come

Point addPoints(const Point& p1, const Point& p2);
Point diffPoints(const Point& p1, const Point& p2);

(i nomi delle funzioni potrebbero essere migliori).

Un'altra opzione potrebbe essere quella di farti possedere la classe Point e avere la tua classe " own " una coppia std :: che rappresenta le coordinate del punto.

Molte volte un " HAS A " la relazione (composizione) è preferibile rispetto a un " IS A " (eredità) relazione.

Penso che " Best Practices " direi di tirare la tua classe Point. In questo modo, puoi rendere il 3D molto più semplice lungo la strada.

L'eredità privata o eredità dell'implementazione è tua amica.

Ciò segue logicamente: un Point NON è una std :: pair, non si desidera avere una conversione up-cast pubblica da Point a std :: pair, ma si desidera utilizzare gli interni di std :: pair.

L'altra possibilità è quella di avere una relazione, o composizione: ogni punto ha una std privata :: coppia che utilizza internamente.

In realtà, non c'è molta differenza tra composizione ed eredità privata, tranne per il fatto che in quest'ultima è possibile forzare un up-cast in std :: pair in una funzione membro Point.

Lancia la tua classe Point. Ciò ti consentirà di fare qualsiasi numero di cose con esso in futuro. In particolare, ho già risolto questo tipo di problema in precedenza e ciò che ho trovato utile è definire la mia struttura Point e creare una classe Point che eredita da essa.

Informativa completa: la STL non mi piace molto.

Non ereditare pubblicamente da std :: pair perché std :: pair ha un operatore < ma il tuo punto non dovrebbe avere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top