Domanda

Sto cercando di utilizzare in avanti dichiarazioni e D-puntatori per eliminare alcuni includono le dipendenze. Tutto sta funzionando bene, tranne che ho usato typedef XList per migliorare la leggibilità in molti luoghi (per esempio: typedef QList<X> XList).

La soluzione per il problema dichiarazione anticipata typedef è quello di utilizzare l'ereditarietà: class XList : public QList<X>{};. QList ha un distruttore non virtuale. Dato il fatto che proprio QStringList di Qt eredita QList<QString> e non sto allocazione XLists sul mucchio, si vede alcun problema con questa soluzione? Dovrei non consentire esplicitamente allocazioni di heap per le classi XList?

È stato utile?

Soluzione

Diamo uno sguardo a ciò che accadrà se definiamo XList in questo modo:

class XList : public QList<X> {};

Di seguito funzionerà come previsto:

  XList* x = new XList;
  delete x;

Tuttavia, il seguente non sarà:

  QList<X>* q = new XList;
  delete q;

distruttore di QList<X> sarà chiamato ma non XList di eventuali. Questo è quello che un distruttore virtuale nella classe base farà per voi.

Se non si utilizza mai le allocazioni di heap si dovrebbe andare bene, ma si sta preparando una trappola per il manutentore ti seguono (o anche da soli in pochi mesi).

Assicurarsi che questa ipotesi è documentato e fare all'operatore XList di new privato per prevenire mucchio di istanza come lei ha ricordato.

L'alternativa sicura sarebbe fare QList<X> un membro della vostra XList, vale a dire:. Preferiscono incapsulamento all'eredità

Altri suggerimenti

QStringList non definisce il proprio distruttore. In questo caso, anche se è stato utilizzato QList polimorfico (si veda l'esempio di blue.tuxedo), non c'è un problema in quanto, anche se il distruttore della classe derivata non verrà chiamato, non ce n'è uno definita.

Nel tuo caso, se avete bisogno di un distruttore nella classe derivata (XList), si incorrerà in problemi. C'è stata una discussione precedente su come muoversi non essere in grado di inoltrare dichiarare definizioni del tipo qui:

dichiarazione anticipata di un typedef in C ++

Se si può evitare di scrivere una classe derivata, si potrebbe essere meglio nel lungo periodo.

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