Restituisce un riferimento all'interno di una cattiva pratica del vettore privato?

1

Ho la seguente classe rifilata:

#include <vector>

#include "Tile.h"

class Board {

    std::vector<Tile> boardArr;

    // VVV Bad Practice? Safe?
    Tile& getTileAt(unsigned int x, unsigned int y);

public:

    Board(int width, int height);

};

Si noti che il vettore rimane della stessa dimensione una volta inizializzata la classe; Non ho metodi per modificarlo. Da quanto ho capito, vector s è garantito per non muoversi, a meno che non sia necessario ridimensionarlo, quindi un riferimento in esso dovrebbe essere sicuro in questo caso.

Da quello che posso dire, questo dovrebbe essere sicuro. Il metodo è privato, quindi non dovrebbe esserci alcun modo per i riferimenti alla perdita.

L'alternativa migliore alla funzione precedente è di restituire una copia di Tile , modificarla, quindi copiare il riquadro modificato indietro. Ho trovato che lo utilizza direttamente molto più pulito, quindi preferirei che sia sicuro.

Questo sarà a thread singolo, e finora, è solo l'uso è di fare cose semplici a un riquadro, come attivare o disattivare una bandiera interna. Un esempio di come lo sto usando:

TurnResult Board::flipTile(unsigned int x, unsigned int y) {
    return getTileAt(x, y).flipTile();
}

void Board::setTileFlag(unsigned int x, unsigned int y, bool flagState) {
    getTileAt(x, y).setFlag(flagState);
}
    
posta Carcigenicate 08.05.2015 - 00:27
fonte

1 risposta

2

Sì, la restituzione di un riferimento a un elemento di std::vector è sicura, a meno che tu non modifichi il numero di elementi nel contenitore mantenendo il riferimento.

Che si tratti di una buona pratica può essere discussa, ma è soprattutto per le funzioni pubbliche, dove restituire un riferimento all'intercapedine dei dati interni.
Se sai che la dimensione della scheda è completamente fissa, restituire un riferimento da una funzione privata è perfettamente corretto.

    
risposta data 08.05.2015 - 08:42
fonte

Leggi altre domande sui tag