[c++] Contenitori stl e tipo da restituire

di il
5 risposte

[c++] Contenitori stl e tipo da restituire

Ciao a tutti. Ho una domanda riguardo ai contenitori stl.
Supponiamo di avere una classe A che contiene nella sua parte privata un contenitore della stl. La classe B ha bisogno di poter accedere agli oggetti contenuti nel contenitore della classe A. Ora quello che potrei fare, è quello di fornire un metodo pubblico in A, che restituisce il suo stesso contenitore per riferimento. Ad esempio:

class A{
private:
    std::vector<T> mioVettore;
public:
    std::vector<T>& getVettoreT()const{ return mioVettore;};
}
Quello che non mi piace di tutto questo, è che se in futuro io volessi cambiare il modo in cui salvo i dati in A,ad esempio usando un contenitore diverso, dovrei andare a modificare tutti i metodi di B che prima usavano il tipo vector, per adattarli al nuovo tipo. In questo caso, che abbiamo solo due classi non è un problema eccessivo, ma nel caso in cui questo metodo fosse stato usato anche da altri classi, ci sarebbe parecchio codice da cambiare.
In quale modo è possibile evitare tutto questo? Che tipo di interfaccia pubblica deve avere A per essere più generica possibile e non dipendere dal suo stesso tipo privato?
Grazie a tutti!

5 Risposte

  • Re: [c++] Contenitori stl e tipo da restituire

    Secondo me una cosa che puoi fare è quella di wrappare il tuo contenitore della STL in una tua classe. In questo modo eventuali modifiche avrebbero effetto solo su questa.

    Ecco un rapidissimo esempio:
    
    #include <iostream>
    #include <vector>
    
    class MyContainer
    {
    public:
    	MyContainer() {};
    	~MyContainer() {};
    
    	void insert(int v) {
    		my_vector.push_back(v);
    	}
    
    	int get(int index) {
    		return my_vector[index];
    	}
    
    private:
    	std::vector<int> my_vector;
    };
    
    
    class A
    {
    public:
    	A() {};
    	~A() {};
    	void insert_some_values() {
    		my_cont.insert(1);
    		my_cont.insert(2);
    	}
    
    	MyContainer& getContainer() {
    		return my_cont;
    	}
    
    private:
    	MyContainer my_cont;
    };
    
    
    class B
    {
    public:
    	B() {};
    	~B() {};
    	void read_some_values(A obj_A) {
    		std::cout << obj_A.getContainer().get(0) << std::endl;
    		std::cout << obj_A.getContainer().get(1) << std::endl;
    	}
    };
    
    
    int main(int argc, char const *argv[])
    {
    	A obj_A;
    	obj_A.insert_some_values();
    
    	B obj_B;
    	obj_B.read_some_values(obj_A);
    
    	return 0;
    }
    
  • Re: [c++] Contenitori stl e tipo da restituire

    Ti ringrazio molto per la pronta e completa risposta.
    Penso che sarà la soluzione che adotterò anche se ho ancora alcuni dubbi. È giusto preoccuparsi di tutto questo oppure solitamente quando si ha un contenitore di questo tipo viene restituito direttamente il contenitore stesso?
    I miei dubbi nascono dal fatto che ho pochissima esperienza di programmazione e non conosco quali siano i modi migliori di procedere davanti a problemi di questo tipo.
  • Re: [c++] Contenitori stl e tipo da restituire

    KiraLive ha scritto:


    È giusto preoccuparsi di tutto questo oppure solitamente quando si ha un contenitore di questo tipo viene restituito direttamente il contenitore stesso?
    Sinceramente non lo so... Forse dipende anche dal tuo programma e dalle modifiche che intendi fare al codice. Se sei preoccupato/a che eventuali future modifiche nel tipo di contenitore ti possano procurare i problemi ai quali accennavi nel primo post, allora utilizza un approccio prudente e difficilmente sbaglierai!
  • Re: [c++] Contenitori stl e tipo da restituire

    Va bene, allora ci penserò ancora un pò. Grazie per l'idea comunque!
  • Re: [c++] Contenitori stl e tipo da restituire

    Prego.
    Preciso che con "approccio prudente" intendevo proprio quello di cui ti parlavo nel secondo post (o una tecnica equivalente). Mi sono accorto che la frase non era molto chiara...
Devi accedere o registrarti per scrivere nel forum
5 risposte