Domanda di stile: per utilizzare la versione sovraccaricata o no?

0

Diciamo che ho avuto un sovraccarico di operator() che ha reso temp_.matrix[k][j] e temp_(k+1, j+1) equivalenti. Nelle mie funzioni di classe (in cui la matrice appartiene), sarebbe meglio avere

if (temp_.matrix[k][j] == 0) { /**do stuff*/ }

o

if (temp_(k+1, j+1) == 0) { /**do stuff*/ }

Mi piace usare la versione vanilla. Ma la versione operator() perché incapsula i dati all'interno dell'operatore, che usiamo per accedervi. Non sono sicuro di utilizzare correttamente la versione di vanilla a causa di questo ragionamento.

    
posta Don Larynx 04.05.2015 - 20:48
fonte

2 risposte

4

Utilizza il sovraccarico dell'operatore se migliora la chiarezza e la manutenibilità del codice.

  • A volte aiuta chiarezza e manutenibilità: a + b è più corto e più chiaro di a.addTo(b) , rende più semplice scrivere algoritmi generici (ad es. modelli) e modificare tipi di dati, ecc.
  • A volte fa male chiarezza e manutenibilità: gli operatori sovraccarichi possono essere sorprendenti (comportamento sorprendente, sorprendentemente costoso, ecc.), può essere più difficile trovare chiamanti, ecc.

Tieni presente che "l'overloading dell'operatore rispetto all'accesso non autorizzato ai membri" non è una decisione binaria; puoi anche utilizzare funzioni con nomi espliciti (ad esempio temp_.get(k, j) ). Inoltre:

  • temp_ fa qualcosa oltre a contenere una matrice?
    • Se temp_ è una matrice, il fatto che la matrice sia una matrice bidimensionale dovrebbe essere incapsulato (sia tramite un operatore sovraccarico o una funzione getter esplicita).
    • Se temp_ non è una matrice, allora l'intera matrice deve essere incapsulata (sia tramite un operatore sovraccarico o una funzione getter esplicita, con matrix modificata in una variabile membro privata).
  • Perché utilizzare k+1,j+1 per operator() ma k, j per matrix[][] ? Se gli indici dovessero essere diversi a seconda di come si accede alla matrice, questo suggerisce un errore di incapsulamento.
risposta data 04.05.2015 - 21:49
fonte
0

Una domanda più fondamentale è se definire il operator() (della classe) per questo scopo o meno. Ahimè, questa decisione è già stata presa dall'autore (s) della classe matrix, quindi dovremmo considerare il suo utilizzo compatibile con l'intento dell'autore (i).

In effetti, questo è ciò che la maggior parte delle librerie a matrice (o array multidimensionale) sceglierebbero di implementare in C ++.

Si noti che la prima versione del codice potrebbe non essere a prova di futuro. Non c'è alcuna garanzia che Matrix.matrix esista nelle versioni future della libreria, o che Matrix matrix; mat.matrix[k][j] continui a essere un'espressione valida a causa di future modifiche alle librerie.

Possibili motivi per cui potrebbero verificarsi tali cambiamenti futuri:

  • La libreria di matrice utilizzava dimensioni di matrice costanti in fase di compilazione (parametrizzazione di modelli), ma è stata successivamente aggiornata per supportare le dimensioni della matrice di runtime.
    • Questo significa che internamente non sta più dichiarando matrix come T matrix[M][N]; .
  • La libreria di matrici utilizzata per mantenere una serie di puntatori all'inizio di ogni riga, ma poi ha deciso di eliminarla per risparmiare un po 'di memoria.
    • Ciò significa internamente che non sta più dichiarando matrix come T** matrix; , quindi il campo potrebbe essere stato rimosso oppure non è possibile utilizzare matrix[row] per ottenere il puntatore iniziale su una riga specifica.
  • La libreria di matrici può aver implementato la cancellazione di tipo, quindi la classe non conosce più il tipo di T in fase di compilazione; invece, contiene solo un puntatore non tipizzato all'inizio del blocco di memoria allocato, come in void* matrix; o uchar* matrix; , dove uchar non ha alcuna relazione con il tipo numerico della matrice.

Tuttavia, se la libreria di matrix è sotto il tuo pieno controllo, vale a dire: l'hai scritta, nessun altro può cambiarla, e tu hai la sola discrezione su quali cambiamenti futuri farti, quindi "a prova di futuro" il problema non si applica a te.

    
risposta data 04.05.2015 - 23:25
fonte

Leggi altre domande sui tag