Come trasmettere i requisiti di durata?

1

Di solito uso std :: unique_ptr per trasmettere la proprietà e passare i puntatori grezzi come parametri quando nessuna proprietà è implicita. Tuttavia, non considero quasi mai un nullptr accettabile come argomento, quindi sarebbe bello usare riferimenti per evitare questo, ma non sono sicuro che la maggior parte delle persone si aspetterebbe che l'oggetto che i riferimenti ai parametri debbano esistere per tutta la vita di la struttura A senza guardare il codice sorgente.

struct A {
    A(B& b)
    :  bPtr(&b) {;}

    void method() {
        // use bPtr
    }

    B* bPtr;
};

Le domande sono:

1) L'unica opzione qui è di rimanere con i puntatori e controllare sempre nullptr?

3) Il fatto che A abbia bisogno che bPtr sia valido significa che dovrebbe prendere un shared_ptr? Se è così, mi sento come se usassi i puntatori condivisi praticamente ovunque.

2) Esistono convenzioni che possono aiutare a trasmettere requisiti di durata per i parametri agli utenti oltre a commenti e documentazione?

    
posta user487100 20.02.2014 - 05:59
fonte

1 risposta

1

Da un punto di vista della lingua C ++, il tuo codice va bene.

Come utente C ++, dipende molto dalla semantica di struct A se mi aspetterei che mantenga un riferimento / puntatore a B , ne faccia una copia o utilizzi il parametro costruttore solo nel costruttore .

Le mie aspettative generali sono (tutto tranne se indicato diversamente):

  • Se un parametro viene passato da un puntatore (intelligente), la classe probabilmente manterrà un riferimento ad esso
  • Se un parametro viene passato da un puntatore (intelligente) e non vi è alcun settatore per esso, allora la classe probabilmente non affronterà i puntatori nulli. Questo può essere rafforzato da un commento.
  • Se un parametro viene passato per riferimento const, è sicuro passare un oggetto temporaneo. L'oggetto ricevente eseguirà una copia o non utilizzerà il parametro oltre il costruttore.
risposta data 20.02.2014 - 08:42
fonte

Leggi altre domande sui tag