• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Operator + pozwalający dodać dwie klasy do siebie.

Object Storage Arubacloud
0 głosów
158 wizyt
pytanie zadane 10 stycznia 2023 w C i C++ przez haitoke Nowicjusz (240 p.)

Witajcie, borykam się z problemem poprawnego wykonania linijki ---- 9 ---- oraz wyświetlenia jej w linijce ---- 10 -----.
Nie mam pojęcia jak inaczej mogę wykonać dodawanie dwóch obiektów tego samego typu (BazaDanych).
Proszę o pomoc, podpowiedzi, cokolwiek :)

 

#include <iostream>
#include <string>
#include <fstream>

using namespace std;
class Osoba
{
private:
    string imie_;
    string nazwisko_;
    long long int pesel_;
public:
    //konstruktor domyslny
    Osoba()
    {
        imie_ = "Czlowiek";
        nazwisko_ = "Domyslny";
        pesel_ = 0;
    }


    //konstruktor parametryczny
    Osoba(string imie_, string nazwisko_, long int pesel_)
    {
        this->imie_ = imie_;
        this->nazwisko_ = nazwisko_;
        this->pesel_ = pesel_;
    }
    //metody dostepowe
    string &imie() {return imie_;}
    string &nazwisko() {return nazwisko_;}
    long long int &pesel() {return pesel_;}

    //operator <<
    friend ostream& operator<<(ostream& os, Osoba& o);
    //operator >>
    friend istream& operator>>(istream& os, Osoba& o);
    //operator ==
    friend bool operator==(const Osoba& a, const Osoba& b);

};
    ostream& operator<<(ostream& os, Osoba& o)
    {
        os << o.imie_ << " " << o.nazwisko_ << " " << o.pesel_ << endl;
        return os;
    }

    istream& operator>>(istream& is, Osoba& o)
    {
        is >> o.imie_ >> o.nazwisko_ >> o.pesel_;
        return is;
    }

    bool operator==(const Osoba& a, const Osoba& b)
    {
        return a.pesel_== b.pesel_;
    }
class BazaDanych
{
private:
    //tablica obiektow typu Osoba w pamieci dynamicznej
    int liczbaOsob = 0;
    Osoba* osoby_ = new Osoba[liczbaOsob];
public:
    //konstruktor domyslny
    BazaDanych()
    {
        if(!osoby_)
        osoby_ = nullptr;
        liczbaOsob = 0;
    }

    //konstruktor kopiujacy
    BazaDanych(BazaDanych& b)
    {
        liczbaOsob = b.liczbaOsob;
        osoby_ = new Osoba [liczbaOsob];
            for(int i = 0; i < liczbaOsob; ++i)
            {
                osoby_[i] = b.osoby_[i];
            }
    }

    //destruktor
    ~BazaDanych(){};

    //operator indeksowania []

    //operator <<
    friend ostream& operator<<(ostream& os, BazaDanych& b);

    //operator dodajacy osobe do bazy danych
    BazaDanych& operator+(Osoba & o)
    {
        Osoba* temp = new Osoba[liczbaOsob + 1];
        for (int i = 0; i < liczbaOsob; ++i)
        {
            temp[i] = osoby_[i];
        }

    temp[liczbaOsob] = o;
    delete [] osoby_;
    osoby_ = new Osoba[liczbaOsob + 1];

        for (int i = 0; i < liczbaOsob+ 1; ++i)
        {
            osoby_[i] = temp[i];
        }
    delete [] temp;
    liczbaOsob++;
    return *this;
    }

    //operator przypisania kupujacego
    BazaDanych& operator=(BazaDanych& bb)
    {
        if(this != &bb)
        {
        delete [] osoby_;
        liczbaOsob = bb.liczbaOsob;
        osoby_ = new Osoba[liczbaOsob];
            for (int i = 0; i < liczbaOsob; ++i)
            {
                osoby_[i] = osoby_[i];
            }
        }
        return *this;
    }
    //operator + dodajacy dwie bazy
    friend BazaDanych& operator+(BazaDanych& b1, BazaDanych& b2);
};
    ostream& operator<<(ostream& os, BazaDanych& b)
    {
        for(int i = 0; i < b.liczbaOsob; ++i)
        {
            os << b.osoby_[i];
        }
        return os;
    }

    BazaDanych& operator+(BazaDanych& b1,BazaDanych& b2)
    {
        BazaDanych temp(b1);
            for(int i = 0; i < b2.liczbaOsob; ++i)
            {
                temp = temp + b2.osoby_[i];
            }
            return temp;
    }
int main()
{
  Osoba o1;
  cout << "---- 1 ----" << endl;
  cout << o1 << endl;

  Osoba o2("Jan", "Kowalski", 11111111111);
  cout << "---- 2 ----" << endl;
  cout << o2 << endl;

  cout << "---- 3 ----" << endl;
  cout << boolalpha << (o1 == o2) << endl;

  BazaDanych db1;
  cout << "---- 4 ----" << endl;
  cout << db1;

  db1 = db1 + o1;
  cout << "---- 5 ----" << endl;
  cout << db1;

  ifstream plik_we("zadanie7.txt");
  if(!plik_we)
  {
    cout << "---- 6 ----" << endl;
    return 1;
  }

  while(plik_we >> o2)
  {
      db1 = db1 + o2;
  }
  cout << "---- 7 ----" << endl;
  cout << db1;

  {
      BazaDanych db2(db1);
      cout << "---- 8 ----" << endl;
      cout << db2;
  }
  cout << "---- 9 ----" << endl;
  cout << db1;
  BazaDanych db3;
  db3 = db1 + db1;

  cout << "---- 10 ----" << endl;
  cout << db3;
    /*
  for(int i=0; i<db3.liczbaOsob(); ++i)
  {
      cout << db3[i] << endl;
  }
  /*
  cout << "---- 11 ----" << endl;

  db1 = db1 - o1;
  cout << "---- 12 ----" << endl;
  cout << db1;

  cout << "---- 13 ----" << endl;
  cout << db3;
  cout << "---- 14 ----" << endl;
    */;
  return 0;
}

 

komentarz 11 stycznia 2023 przez Oscar Nałogowiec (29,320 p.)
Dodając 2 bazy ni rób tego po 1 elemencie - n razy allokujesz tablicę o 1 większa i dodajesz element. Od razu zaalokuj sumę dlugości baz i skopiuj dane.
komentarz 11 stycznia 2023 przez prutprut Początkujący (370 p.)

@haitoke, czyżby kolejny uczestnik kursu iście przestarzałego i słabego dydaktyczno-merytorycznie kursu c++ pana Zelenta?

naprawdę odradzam.

komentarz 11 stycznia 2023 przez haitoke Nowicjusz (240 p.)

Zadanie z laboratoriów na jednej z politechnik laugh

 

komentarz 11 stycznia 2023 przez prutprut Początkujący (370 p.)
a to spoczko

2 odpowiedzi

+3 głosów
odpowiedź 11 stycznia 2023 przez j23 Mędrzec (194,920 p.)
wybrane 11 stycznia 2023 przez haitoke
 
Najlepsza

Operator + powinien zwracać nowy obiekt, a u Ciebie operator dodający osobę zwraca obiekt this. Zachowuje się tak, jakby był operatorem +=.

Operator dodający dwie bazy zwraca referencję na obiekt lokalny - to błąd. Obiekt lokalny poza funkcją nie istnieje. Zwracaj przez wartość.

Powinieneś zadbać o const correctness. Czyli metody, które nie zmieniają stanu obiektu, powinny być const, parametry przekazywane przez referencję/wskaźnik także powinny być const, jeśli nie zamierzasz zmieniać ich stanu.

 

BTW, skoro masz zdefiniowany ctor kopiujący, to operator kopiujący możesz zredukować do:

BazaDanych& operator= (BazaDanych bb)
{
    std::swap(osoby_, bb.osoby_);
    std::swap(liczbaOsob, bb.liczbaOsob);
    return *this;
}

Zresztą masz w nim błąd.

Destruktor BazaDanych powinien usunąć osoby_.

Użyj std::vector zamiast bawić się w tablice dynamiczne.

0 głosów
odpowiedź 11 stycznia 2023 przez TOWaD Mądrala (6,000 p.)
edycja 11 stycznia 2023 przez TOWaD

Online jakoś dział 9 i 10 działa ale nie wiem czy poprawnie. Jak coś poprawie to z edytuję. Ale rzeczywiście odpowiedz @J23 powinna być najlepsza.

edit :: Dodam troszeczkę poprawiony kod

Podobne pytania

0 głosów
0 odpowiedzi 1,047 wizyt
pytanie zadane 31 lipca 2016 w C i C++ przez Pac Plus Mądrala (5,560 p.)
0 głosów
1 odpowiedź 281 wizyt
0 głosów
1 odpowiedź 303 wizyt
pytanie zadane 6 kwietnia 2021 w C# przez rotonhageton Nowicjusz (120 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...