Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Costruttore di copia

    Ciao a tutti.
    Dovrei implementare un costruttore di copia, che all'interno copi degli attributi che sono dei template:
    codice:
    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;
    };
    codice:
    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:
    codice:
    Casa *case[numero_totale_case];
    E in un altro punto è presente
    codice:
    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
    codice:
    lista_coordinate(casa.lista_coordinate);
    Gentilmente sapete spiegarmi il problema?
    Grazie anticipatamente.
    Ciao.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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:
    codice:
    Casa::Casa(const Casa& casa) : lista_coordinate(casa.lista_coordinate)
    { 
    }
    Se vuoi tenerla nel corpo del costruttore di copia devi fare.
    codice:
    Casa::Casa(const Casa& casa) 
    { 
        std::copy(
            casa.lista_coordinate.begin(),
            casa.lista_coordinate.end(), 
            std::back_inserter(lista_coordinate)
        );
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    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:

    codice:
    case[n_c] = new Casa(questa_casa[n]);
    Ma potrebbe anche essere che questa_casa[n] è un parametro sbagliato.
    Purtroppo non sono un indovino
    Posta anche il resto del codice, oppure spiega cosa sono quelle variabili.

  4. #4
    Grazie.
    Un'altra cosa, ora come errore esce:
    codice:
    error: no matching function for call to ‘Casa::Casa(Casa*&)’
    note: candidates are: Casa::Casa(const Casa&)
    C'entra perché faccio così?
    codice:
    case[n_c] = Casa(questa_casa[n]);
    Grazie anticipatamente.
    Ciao

  5. #5
    Who am I, hai ragione, scusa.
    Immagina che fuori da un ciclo while c'è:
    codice:
    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
    codice:
    case[n_c] = Casa(questa_casa[n]);
    e poi viene incrementato n_c.
    Ciao.

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    codice:
    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.

  7. #7
    Si, è come dici.
    Così funziona, grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.