View Single Post
Old 19-05-2007, 22:04   #5
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da Manugal Guarda i messaggi
Ciao.

Ho dichiarato in un file, questa classe:

Codice:
class Dns{
      private:
         vector<int> proxy;      
         vector<Provider> provider;   //un'array di Provider (Provider è una struct definita in un altro file)
         map<string, vector<int> > mapper;    
      public:
         Dns();   
         Dns(vector<int> , vector<Provider>); 
         void Associations(int, int); 
         void stampa_mapper(int []);
};
Il corpo del costruttore con argomenti è:

Codice:
Dns::Dns(vector<int> newp, vector<Provider> newprov){
   proxy=newp;
   provider=newprov;
}
Ora se dal main istanzio un oggetto di tipo Dns con tale costruttore, succede che provider viene correttamente copiato da newprov mentre proxy no. Infatti se vado a fare un debugging con gdb mi accorgo che provider contiene correttamente tutti i campi che ho inizializzato nel main, mentre proxy (nonostante sia correttamente inizializzato con tutti i valori nel main) non ha nessun campo inizializzato (anzi l'indirizzo di memoria è proprio NULL). Non capisco perché non riesce a passarglielo correttamente. Avete idee? Grazie.
A parte le varie ottimizzazioni possibili, come costruisci la classe Dns?
Giusto perchè, se provi questo codice che ho scritto al volo:

Codice:
#include <iostream>
#include <vector>

using namespace std;

class Test
{
	public:
		Test(vector<int> v) { vect = v; };
		void print() {
			for (int i = 0; i < vect.size(); i++)
				cout << vect[i] << endl;
		}
	private:
		vector<int> vect;
};

int main()
{
	vector<int> v;
	Test *test;
	
	v.push_back(1);
	v.push_back(3);
	v.push_back(5);
	test = new Test(v);
	test->print();
	delete test;

	return 0;
}
il tutto funziona.

EDIT: Ricorda una cosa: quando usi l'operatore 'push_back' su un oggetto vector che NON contiene puntatori ma oggetti/tipi, l'oggetto NON viene inserito copiandolo, ma costruendone un altro (quindi viene chiamato il costruttore della classe che stai inserendo). Puoi immaginare i problemi derivanti se usi classi astratte (polimorfismo)... Idem se usi l'operatore =.
Te lo dico perchè vedo dal tuo codice che usi un vector<Provider> (ok che Provider è una struct, ma se un giorno volessi usare una classe, pensando ad un possibile code recycling...).
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 19-05-2007 alle 22:14.
-fidel- è offline   Rispondi citando il messaggio o parte di esso