Quote:
Originariamente inviato da Manugal
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...).