Idealna klasa, C-napisy

0

Witam serdecznie.

Mam do wykonania zadanie, z którym mi trochę opornie idzie. Potrzebuje waszej pomocy, jakiejś podpowiedzi:
Oto treść zadania:

Przygotuj klasę Osoba z prywatnymi polami char imie, char nazwisko, Osoba** dzieci i int wiek. Zadbaj aby definicja tej klasy byla całkowicie samowystarczalna i hermetyczna. przedefiniuj wszystkie domyślnie tworzone elementy tej klasy. Zaimplementuj operacje:

-zwiększenia wieku o 1 przez operator ++;
-zmiany, dodania lub usunięcia dowolnej litery przez operator + i -;**

Oto mój kod:

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

using namespace std;

class Osoba{
   
   private:
           
   char* imie;
   char* nazwisko;
   Osoba** dzieci;
   int wiek;   
      
   public:
   Osoba() { cout << "Pusta osoba!"; }
   Osoba(char* imie, char* nazwisko) : imie(imie), nazwisko(nazwisko) { dzieci = NULL; wiek = 0; }
   Osoba(char* imie, char* nazwisko, int wiek) : imie(imie), nazwisko(nazwisko), wiek(wiek) { dzieci = NULL; }
   Osoba(char* imie, char* nazwisko, int wiek, Osoba** dzieci) : imie(imie), nazwisko(nazwisko), wiek(wiek), dzieci(dzieci) {}
   
   Osoba(char* im, char* na, Osoba** dz, int w) : wiek(w), dzieci(dz)
   {
        imie = new char[strlen(im)+1];
        nazwisko = new char[strlen(na)+1];
        strcpy(imie,im);
        strcpy(nazwisko,na);
    }
 
    Osoba(const Osoba& os)
    {
        wiek = os.wiek;
        dzieci = os.dzieci;
        imie = new char[strlen(os.imie)+1];
        nazwisko = new char[strlen(os.nazwisko)+1];
        strcpy(imie,os.imie);
        strcpy(nazwisko,os.nazwisko);
    }
    
    ~Osoba()
    {
        delete[] imie;
        delete[] nazwisko;
        imie = NULL;
        nazwisko = NULL;
        dzieci = NULL;
        wiek = 0; 
    }
   
   void setImie(char* imie){ this->imie = imie; }
   void setNazwisko(char* nazwisko){ this->nazwisko = nazwisko; }
   void setWiek(int wiek){ this->wiek = wiek; }
   void setDzieci(Osoba** dzieci){ this->dzieci = dzieci; }
   
   void operator+(){
     wiek++;     
   }     
     
   Osoba strcat(const Osoba& os, const char* s){
         strcat(os.imie, s);
         strcat(os.nazwisko, s);
          }
     
   Osoba operator+(const Osoba& os){
         
         }
         
   Osoba operator-(const Osoba& os){
         
         }

   friend ostream& operator<<(ostream &os, const Osoba &ktos);      
}; 

ostream& operator<<(ostream &os, const Osoba& ktos) {
  os << ktos.imie << " " << ktos.nazwisko << " (lat:" << ktos.wiek << ")" << endl;
  return os;
}

int main(int argc, char *argv[])
{
    system("PAUSE");
    return EXIT_SUCCESS;
}

Nie wiem czego jeszcze brakuje tej klasie oraz jak prawidłowo rozwiązać ostatni podpunkt.
Dziękuje za poświęcenie mi chwili czasu.

0

Wykładowca najpewniej chce cię ucapić na problem osoba1=osoba2.Zatem potrzebujesz jeszcze zdefiniować operator=

0

uwagi:

  1. kontruktor bezargumentowy: nie inicjuje zmiennych klasy. Wykonanie poniższego kodu wywali ci wyjątek:
Osoba os1;
Osoba os2(os1)
  1. konstruktory 2, 3, 4
    a) robisz plytkie kopiowanie wskaźników,
    b) zamień "char* imie" na "const char* imie" i tak dla pozostalych "char*"

  2. Osoba(const Osoba& os)
    a) z powodu uwagi w pkt.1 może wywalić wyjątek ze względu na wiszące wskaźniki
    b) zanim zaczniesz alokowac pamięć sprawdź, czy os.imie i os.nazwisko != 0

  3. destruktor: "NULL" jest chyba tylko pod windą, użyj 0 do zerowania wskaźników

  4. setImie, setNazwisko - plytkie kopiowanie wskaźników, parametry zamień na "const char*"

0

Jeszcze kilka uwag:
w sumie w destruktorze nie ma sensu zerowac wskaźników
jeśli zamienisz płytkie kopiowanie wskaźników na głębokie, to w destruktorze zadbaj o zwolnienie pamięci dla Osoba** dzieci

Zamiast "Osoba** dzieci" powinno być "Osoba* dzieci". A z drugiej strony w poleceniu jest napisane, że ma to być typ "Osoba dzieci", jakby można było mieć tylko jedno dziecko. Ciekawe jak ma być naprawdę

void operator+() - powinno być "void operator++"

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