Esiste un modo corretto per consentire l'accesso all'elenco privato per riferimento?

3

Sto provando a fornire un getter per riferimento a un elenco di oggetti in una classe. Il mio setup ha un aspetto simile a questo:

class c_Container
{
public:
    c_Item* Get(int uid);
private:
    c_Item itemList[10];
}

class c_Item
{
public:
    int uid;
}

c_Item* c_Container::Get(int uid)
{
    for (int i = 0; i < 10; i++)
    {
        if (itemList[i].uid == uid)
        {
            return &itemList[i];
        }
    }

    return NULL;
}

Questo è un esempio semplicistico che mostra l'utilizzo, di solito un oggetto c_Item avrebbe altri metodi che farebbero altre cose. Vorremmo ottenere l'oggetto c_Item da itemList per riferimento o per indirizzo in modo che possiamo modificarlo direttamente.

Durante la compilazione, ottengo un errore di sfilacciamento come "Exposing low access member" itemList "". Se provo a tornare per riferimento invece di restituire un puntatore, ottengo la stessa cosa. Credo di capire perché, ma non riesco a concepire un modo migliore per ottenere un oggetto da una classe di container come questo per riferimento. Posso correggere l'errore rendendo publicList pubblico, ma sembra un accesso non necessario.

Al di fuori della creazione di metodi wrapper in c_Container per tutti i metodi di c_Item (che sembra ridondante), c'è un modo migliore per gestire una situazione come questa?

    
posta slain 12.07.2013 - 19:33
fonte

1 risposta

4

Le classi contenitore sono un'eccezione alla regola generale che non devi fornire l'accesso pubblico ai membri privati (restituendo un puntatore o un riferimento in un getter).

Tuttavia, uno strumento di sfilacciamento non è abbastanza intelligente da determinare se l'eccezione del contenitore dovrebbe applicarsi al metodo Get o meno, quindi prova a fare l'assunzione sicura e genera un avviso. La maggior parte degli strumenti di lanugine può ricevere ulteriori informazioni attraverso le annotazioni del codice sorgente. Controlla la documentazione del tuo strumento per vedere come può essere informato che l'avviso per questa funzione è un falso positivo e dovrebbe essere soppresso.

    
risposta data 13.07.2013 - 12:49
fonte

Leggi altre domande sui tag