PDA

Visualizza la versione completa : [C++] Costruttore di copia


ziobacco
24-04-2012, 18:46
Ciao a tutti.
Dovrei implementare un costruttore di copia, che all'interno copi degli attributi che sono dei template:

class Casa
{
public:
Casa();
Casa(const Casa& casa);
void addListaCoordinate(unsigned int* coordinate);
std::list<unsigned int*> getListaCoordinate();
private:
std::list<unsigned int*> lista_coordinate;
};



Casa::Casa() { }

Casa::Casa(const Casa& casa)
{
lista_coordinate(casa.lista_coordinate);
}

void Casa::addListaCoordinate(unsigned int* coordinate)
{
this->lista_coordinate.push_back(coordinate);
}

std::list<unsigned int*> Casa::getListaCoordinate()
{
return this->lista_coordinate;
}

Immaginando che ad un certo punto del main viene fatto:

Casa *case[numero_totale_case];
E in un altro punto è presente

case[n_c] = Casa(questa_casa[n]);

Così facendo esce l'errore:
error: no match for call to ‘(std::list<unsigned int*>) (const std::list<unsigned int*>&)’
Che ovviamente deriva da
lista_coordinate(casa.lista_coordinate);

Gentilmente sapete spiegarmi il problema?
Grazie anticipatamente.
Ciao.

shodan
24-04-2012, 19:12
A stretto giro, non ti servirebbe un costruttore di copia visto che stai usando una std::list che già lo implementa di suo (e il compilatore sa quando richiamarlo in automatico), questa istruzione è legale solo nella initialization list:


Casa::Casa(const Casa& casa) : lista_coordinate(casa.lista_coordinate)
{
}

Se vuoi tenerla nel corpo del costruttore di copia devi fare.


Casa::Casa(const Casa& casa)
{
std::copy(
casa.lista_coordinate.begin(),
casa.lista_coordinate.end(),
std::back_inserter(lista_coordinate)
);
}

Who am I
24-04-2012, 23:15
Quando poni un problema scrivi sempre il contesto: dal tuo codice non si capisce che tipo di variabile è n_c, nemmeno che tipo di variabile è questa_casa, e nemmeno cosa stai tentando di fare.
Tieni presente che:

-case è un array di puntatori;
-case[i] è un puntatore;
-*(case[i]) è un oggetto di tipo casa.

Se n_c è di tipo unsigned int* (è un puntatore) allora il problema è questo.
Se n_c è di tipo unsigned int allora il problema è che case[n_c] è un puntatore per cui potevi voler fare:



case[n_c] = new Casa(questa_casa[n]);


Ma potrebbe anche essere che questa_casa[n] è un parametro sbagliato.
Purtroppo non sono un indovino :mame:
Posta anche il resto del codice, oppure spiega cosa sono quelle variabili.

ziobacco
24-04-2012, 23:21
Grazie.
Un'altra cosa, ora come errore esce:

error: no matching function for call to ‘Casa::Casa(Casa*&)’
note: candidates are: Casa::Casa(const Casa&)

C'entra perché faccio così?

case[n_c] = Casa(questa_casa[n]);
Grazie anticipatamente.
Ciao

ziobacco
24-04-2012, 23:32
Who am I, hai ragione, scusa.
Immagina che fuori da un ciclo while c'è:

Casa *case[numero_totale_case];
Dentro il ciclo while, ad ogni iterazione, viene incrementata la variabile unsigned int n_c, che parte da 0.
Ad ogni iterazione questa_casa punta a un tot di oggetti dove ognuno viene riempito con dei valori.
Ad un certo punto, per qualche motivo, viene scelto solo un oggetto di questi (es questa_casa[n]) che, con i suoi valori, viene copiato in case[n_c] (probabilmente alla prossima iterazione i valori di questa_casa[n] cambieranno)
Quindi all'interno del ciclo while viene fatto

case[n_c] = Casa(questa_casa[n]);
e poi viene incrementato n_c.
Ciao.

Who am I
24-04-2012, 23:47
case[n_c] = new Casa( *(questa_casa[n]) );


Assumendo che questa_casa sia un array di puntatori a Casa, perché dalla frase "punta ad un tot di oggetti" non si capisce bene.

ziobacco
24-04-2012, 23:56
Si, è come dici.
Così funziona, grazie.

Loading