C ++ restituendo riferimenti

2

Esaminare la creazione di una libreria GUI per un motore di gioco. Generalmente evito i puntatori se non ne ho bisogno e nel mio esempio sottostante trovo che non lo faccio e funziona, ma solo curioso di sapere se questo disegno è generalmente considerato una buona pratica o se qualcuno ha commenti su di esso.

int main()
{
    // all widgets are positioned and sized according to the window size
    Window wndOptions("wndOptions");

    Button cmdExit("cmdExit");

    // the window doesn't own the widgets nor does it create the widgets so it's not responsible for deleting the widgets
    wndOptions.AddWidget(&cmdExit);

    // this is how you can find a control and get it casted also. make your variable a reference
    Button& test = wndOptions.FindWidget<Button>("cmdExit");

    test.SetPosition(50, 25);

    return 0;
}

Come puoi vedere, l'idea è di creare i tuoi controlli (in questo caso il pulsante) e passare un puntatore ad essi nella Finestra. Quindi puoi trovare il controllo per nome restituendo un riferimento a quel controllo in cui puoi manipolare il controllo. In questo esempio è un po 'inutile usare FindWidget () dato che ho la variabile cmdExit, ma se dovessi passare la finestra intorno sarebbe un modo per trovare e usare i controlli.

Il problema più grande che ho è che FindWidget () potrebbe non trovare un widget. In questo momento lancio un'eccezione perché non trovo un controllo che ritengo una vera eccezione e non qualcosa che dovrebbe accadere molto se non del tutto.

Qualche commento sull'uso fatto in questo modo?

    
posta user441521 16.05.2014 - 20:48
fonte

2 risposte

2

Sembra buono finora, anche se mi sto chiedendo una cosa:

Perché un Window non possiede i widget? Sembra perfettamente ragionevole per me, dal momento che ha già la capacità di memorizzare e restituirli. Chi altri li avrebbe posseduti?

Se i widget hanno effettivamente più proprietari, suggerirei di utilizzare std::shared_ptr - rende esplicita la proprietà e impedisce errori come il passaggio dei puntatori alle variabili dello stack locali, ecc. In effetti, in genere, dovrei usare puntatori intelligenti il più possibile .

Restituire riferimenti e generare eccezioni sono entrambe buone scelte per i miei occhi.

    
risposta data 16.05.2014 - 23:50
fonte
0

Lanciare un'eccezione dovrebbe significare che un pezzo di codice trattiene l'eccezione e lo gestisce in modo appropriato.

Ciò potrebbe significare riportare l'errore all'utente per la correzione. Le eccezioni possono essere causate da situazioni transitorie in cui il meccanismo di gestione deve riprovare più tardi.

Se si tratta di un errore di programmazione che non consente di trovare il widget, è possibile utilizzare un'eccezione, ma è probabile che sia preferibile un asserzione.

Utilizzeresti shared_ptr se il widget ha più di un "proprietario" e la pulizia dipende da quando viene rilasciato l'ultimo riferimento. A volte shared_ptr viene anche spesso usato come un modo conveniente per memorizzare gli elementi in una raccolta in quanto ha la semantica giusta, anche se, in un certo senso, la collezione "lo possiede".

Se non trovare qualcosa è una condizione "normale", allora si dovrebbe restituire un puntatore e non un riferimento.

    
risposta data 07.10.2014 - 10:51
fonte

Leggi altre domande sui tag