Klasy, Konstruktor kopiujacy, lista inicjalizacyjna

0

Witam serdecznie. Mam do wykonania takie zadanie:

user image

Zrobiłem coś takiego, chciałbym prosić was abyście sprawdzili kod i poprawili mnie. Jest to dla mnie bardzo ważne, a nie wydaje mi się abym coś tu mógł dalej samemu zdziałać. Pozdrawiam

 #include <cstdlib> 
#include <iostream> 

 using namespace std; 

 class Osoba { 
       public: 
       char* imie; 
       int wiek; 
       
       Osoba(){ 
             cout << "Konstruktor()" << imie << endl;
             imie = imie;
             wiek = wiek;
       }    
       
       Osoba(char* imie, int wiek) : imie(imie), wiek(wiek)
             { 
             cout << "Konstruktor(imie, wiek): " << imie << endl;  // lista inicjalizacyjna
             }            
        
       Osoba(const Osoba& os){
                   imie = os.imie;
                   wiek = os.wiek; //konstruktor kopiujacy
                   }
       ~Osoba(){ 
             cout << "Destruktor(): " << imie << endl << "Zwolniono pamiec" << endl;    
             delete imie;
             imie="";
             wiek=0;
       }      
       
       friend void show(Osoba* bin);      
 };      

 void show(Osoba* bin){ 
      cout << "Imie: " << bin->imie << endl; 
      cout << "Wiek: " << bin->wiek << endl;      
 }      

 int main(int argc, char *argv[]) 
 { 
     Osoba ja;
     ja.imie = "Sebastian";
     ja.wiek = 21;
     
     Osoba* ja2 = new Osoba("Sebastian", 21); 
     show(ja2);
     //wskaznik do obiektu
     Osoba* &ref = ja2;
     Osoba* ja3(ref);
     show(ja2);
     show(ja3);
     ja2->~Osoba();
     show(ja3);
     system("PAUSE"); 
     return EXIT_SUCCESS; 
 }
0

Przykro mi, ale w tym kodzie mało co jest napisane poprawnie...

#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>

using namespace std;

class Osoba
{
public:
    char* imie;
    int wiek;

    Osoba()
    {
        cout << "Konstruktor()"<< endl;
        //nie mam pojęcia co ktoś rozumie przez "wprowadzający wartości pól" ale zgaduje ze trzeba je po prostu wczytać
        string im;
        cout<<"Podaj imie i wiek"<<endl;
        cin>>im>>wiek;
        imie = new char[im.length()+1];
        strcpy(imie,im.c_str());
    }

    Osoba(char* im, int w):wiek(w)
    {
        cout << "Konstruktor(imie, wiek): " << imie << endl;
        imie = new char[strlen(im)+1];
        strcpy(imie,im);
    }

    Osoba(const Osoba& os)
    {
        wiek = os.wiek; //konstruktor kopiujacy
        imie = new char[strlen(os.imie)+1];
        strcpy(imie,os.imie);
    }
    ~Osoba()
    {
        cout << "Destruktor(): " << imie << endl << "Zwolniono pamiec" << endl;
        delete[] imie;
        imie = NULL;
        wiek = 0;
    }

    friend void show(const Osoba& osoba)
    {
        cout << "Imie: " << osoba.imie << endl;
        cout << "Wiek: " << osoba.wiek << endl;
    }
};

int main(int argc, char *argv[])
{
    Osoba ja;
    Osoba* ja2 = new Osoba();

    Osoba* ja3 = new Osoba("Jan",13);
    Osoba& ref = *ja3; //referncja miała być do obiektu...
    Osoba ja4 = ref; //konstruktor kopiujacy

    show(*ja3);
    show(ja4);
    delete ja3; //za ręczne wywołanie konstruktora należaloby cię łamać kołem...
    show(ja4);

    system("PAUSE");
    return EXIT_SUCCESS;
}

0

Wszędzie, gdzie masz imie = new char[strlen(im)]; powinno być imie = new char[strlen(im) + 1]; -> potrzebne jeszcze miejsce na NULL

0

Dziękuje wam bardzo.
Niezmiernie mi pomogliście należą wam się brawa.

Uważam temat za zakończony...
Dzięki, dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1