I getter e i setter di un contenitore stl devono accedere al contenitore stesso o agli elementi al suo interno?

0

Considera che ho un vettore e una mappa come membri della classe:

class MyClass{
protected:
    std::vector<int> myVector;
    std::map<int,std::string> myMap;
};

Se getter e setter accedono al contenitore stesso in questo modo,

class Myclass{
public:
    std::vector<int>& getMyVector(){
        return this->myVector;
    }

    std::map<int,std::string>& getMyMap(){
        return this->myMap;
    }
protected:
    std::vector<int> myVector;
    std::map<int,std::string> myMap;
};

o accedi agli elementi all'interno del contenitore in questo modo:

class Myclass{
public:
    int getMyVectorAtIndex(int i){
        return this->myVector[i];
    }

    void setMyVectorAtIndex(int i,int v){
        this->myVector[i]=v;
    }

    std::string getMyMapByKey(int k){
        return this->myMap[k];
    }

    void setMyMapByKey(int k,std::string v){
        this->myMap[k]=v;
    }
protected:
    std::vector<int> myVector;
    std::map<int,std::string> myMap;
};

    
posta ggrr 13.10.2016 - 09:32
fonte

2 risposte

5

Una classe dovrebbe incapsulare il suo stato, il che significa astrazione su di esso.

Nel primo esempio, i tuoi membri potrebbero anche essere pubblici, dal momento che restituire riferimenti consente all'utente di fare assolutamente qualsiasi cosa con loro comunque.

Il secondo è più difficile da decidere. La natura teoretica del tuo esempio significa che non mi piace ancora; i nomi sono privi di significato e non riesco a vedere quale astrazione è fornita dalla classe.

Il mio punto è che non ci può essere una regola "di come esponi i membri del container", perché ciò significherebbe che la tua interfaccia sarà guidata dall'implementazione, che è il modo sbagliato di farlo. Quello su cui devi pensare è quale interfaccia ha senso per la classe che stai scrivendo, e quindi puoi decidere come implementarla.

    
risposta data 13.10.2016 - 10:09
fonte
4

La tua classe è una stupida borsa di contenitori? Quindi concedi loro l'accesso diretto!

La tua classe sta mantenendo uno stato interno complesso in contenitori? Quindi probabilmente non vuoi esporre lo stato interno a danni esterni (specialmente se quel vettore e questa mappa sono in qualche modo sincronizzati tra loro).

tl; dr dipende da cosa stai cercando di ottenere. "Le cose in una classe" non sono sufficienti per indovinare cosa stai cercando di ottenere.

    
risposta data 13.10.2016 - 13:14
fonte

Leggi altre domande sui tag