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

    C++ Ereditarietà e costruttori di copia

    Salve ragazzi non capisco il motivo per cui quando voglio fare la copia di d appartente alla classe D derivata da B mi chiama il costruttore a zero argomenti di B anziche quello di copia...

    #include <iostream>
    #include <stdlib.h>
    using namespace std;

    class B{
    protected:
    char* s;
    int n;
    public:
    B():s("ciao"),n(9){}
    B(const char* S,const int N):s(new char[strlen(S)+1]),n(N){strcpy(s,S);cout<<"Costruttore.base\n";}
    ~B(){delete []s;cout<<"distruttore base\n";}
    B(const B&);
    void chisei(){cout<<s<<" "<<n<<endl;}
    };

    class Dublic B{
    protected:
    char* q;
    public:
    D():q("ciao"){}
    D(const char* S,const int N,const char* Q):B(S,N),q(new char[strlen(Q)+1]){strcpy(q,Q);cout<<"costruttore derivata\n";}
    ~D(){delete q;cout<<"distruttore derivata\n";}
    D(const D&);
    void chisei(){cout<<s<<" "<<n<<" "<<q<<endl;}
    };

    int main(int argc, char *argv[])
    {

    char* s="les";
    int n=0;
    char* q="leqq";
    D d(s,n,q);

    D m(d);
    m.chisei();
    system("PAUSE");
    return 0;
    }



    B::B(const B& b1)
    { n=b1.n;s=new char[strlen(b1.s)+1];strcpy(s,b1.s);cout<<"copio base\n";}

    D:(const D& b1)
    { q=new char[strlen(b1.q)+1];strcpy(q,b1.q);cout<<"copio derivata\n";}


    MI POTETE AIUTARE PERFAVORE?GRAZIE

  2. #2
    vi prego aiutatemi ,è da ore che ci sbatto la testa

    forse si deve rikiamare esplicitamente attraverso il costruttore di copia della classe derivata...ma qual'è la sintassi?

  3. #3
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Ho provato a fare i ldebug ed effettivamente viene invocato il costruttore a zero parametri di B quando chiami la funzione di copia di D. Pero il tuo costruttore di copia nn mi sembra proprio completo.

    D::D(const D& b1){
    n = b1.n;
    s = new char[strlen(b1.s)+1];
    strcpy(s, b1.s);

    q = new char[strlen(b1.q)+1];
    strcpy(q, b1.q);
    cout<<"copio derivata\n";
    }


    L'output i nquesto caso diventa
    Costruttore base
    costruttore derivata
    les 0 leqq
    copio derivata
    les 0 leqq


    (ho fatto stampare d ed m ...m è identico a d ora)
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  4. #4
    grazie per la tua risposta ma dopo 20 minuti che ho messo il topic ho trovato la soluzione...
    il costruttore di copia della classe derivata deve copiare solo la parte proprio,al parte del sottooggetto della classe base ci deve pensare il costruttore della classe base la cui invocazione avviene in questo modo,passando l'oggetto derivato al costruttore della classe base esso provvederà a effettuare la copia...facendo così tutto inline ,il programma va bene

    class Dublic B{
    protected:
    char* q;
    public:
    D(const D& d1):B(d1)
    { q=new char[strlen(d1.q)+1];strcpy(q,d1.q);cout<<"copio derivata\n";}
    D(const char* S,const int N,const char* Q):B(S,N),q(new char[strlen(Q)+1]){strcpy(q,Q);cout<<"costruttore derivata\n";}
    ~D(){delete q;cout<<"distruttore derivata\n";}

    void chisei(){cout<<s<<" "<<n<<" "<<q<<endl;}
    };

    ho

  5. #5
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    beh io lo avevo fatto esplicitamente cmq invocare il costruttore è piu ...fine
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

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.