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

Programowanie obiektowe, wpisywanie class do wskaznika na tablice.

Object Storage Arubacloud
0 głosów
199 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez MaTiDxxx Początkujący (290 p.)
#include <iostream>
#include <string>

using namespace std;

class Osoba
{
	protected:
		string imie;
		string nazwisko;
		int wiek;
		string zawod;
	public:
		Osoba()
		{
			imie = "NULL";
			nazwisko = "NULL";
			wiek = 0;
			zawod = "NULL";
		}
		
		void set_imie(string name)
		{
			imie = name;
		}
		
		void set_nazwisko(string surname)
		{
			nazwisko = surname;
		}
		
		void set_wiek(int age)
		{
			wiek = age;
		}
		
		void set_zawod(string job)
		{
			zawod = job;	
		}
		
		string get_imie()
		{
			return imie;
		}
		
		string get_nazwisko()
		{
			return nazwisko;
		}
		
		int get_wiek()
		{
			return wiek;
		}
		
		string get_zawod()
		{
			return zawod;
		}
		
		void Wypisz()
		{
			cout << endl;
			cout << "Imie: " << imie << endl;
			cout << "Nazwisko: " << nazwisko << endl;
			cout << "Wiek: " << wiek << endl;
			cout << "Zawod: " << zawod << endl;
		}
		
		~Osoba()
		{
		}
};

class Ksiazka
{
	protected:
		Osoba autor;
		string tytul;
		string dataWydania;
		string wydawnictwo;
		float cena;
		
	public:
		Ksiazka()
		{
			autor.set_imie("NULL");
			autor.set_nazwisko("NULL");
			autor.set_wiek(0);
			autor.set_zawod("NULL");
			tytul = "NULL";
			dataWydania = "NULL";
			wydawnictwo = "NULL";
			cena = 0;
		}
		
		Ksiazka(string name1, string surname1, int age1, string job1, string title1, string idkwhat1, string stilldontknow1, float price1)
		{
			autor.set_imie(name1);
			autor.set_nazwisko(surname1);
			autor.set_wiek(age1);
			autor.set_zawod(job1);
			tytul = title1;
			dataWydania = idkwhat1;
			wydawnictwo = stilldontknow1;
			cena = price1;
		}
		
		string get_imieautora()
		{
			return autor.get_imie();
		}
		
		string get_nazwiskoautora()
		{
			return autor.get_nazwisko();
		}
		
		int get_wiekautora()
		{
			return autor.get_wiek();
		}
		
		string get_zawodautora()
		{
			return autor.get_zawod();
		}
		
		string get_tytul()
		{
			return tytul;
		}
		
		string get_dataWydania()
		{
			return dataWydania;
		}
		
		string get_wydawnictwo()
		{
			return wydawnictwo;
		}
		
		float get_cena()
		{
			return cena;
		}
		
		void Wypisz()
		{
			cout << "Imie autora: " << autor.get_imie() << endl;
			cout << "Nazwisko autora: " << autor.get_nazwisko() << endl;
			cout << "Wiek autora: " << autor.get_wiek() << endl;
			cout << "Zawod autora: " << autor.get_zawod() << endl;			
			cout << "Tytul: " << tytul << endl;
			cout << "Data wydania: " << dataWydania << endl;
			cout << "Wydawnictwo: " << wydawnictwo << endl;
			cout << "Cena: " << cena << endl;
		}
		
		~Ksiazka()
		{
		}
};

class Czytelnik : public Osoba
{
	protected:
		Ksiazka *tab[3];
	
	public:
		Czytelnik()
		{
			for ( int i = 0; i<3; i++)
			{
				tab[i] = new Ksiazka("","",0,"","","","",0);
			}
		}
		
		void set_czytelnik(string name2, string surname2, int age2, string job2)
		{
			imie = name2;
			nazwisko = surname2;
			wiek = age2;
			zawod = job2;	
		}
		
		Ksiazka set_przypisz(int abc)
		{
			return	*tab[abc];	
		}
		
		void wypiszKsiazki()
		{
			Osoba::Wypisz();
			cout << endl << "Wypozyczone ksiazki: " << endl << endl;
			for(int i=0; i<3;)
			{
				if(tab[i]->get_tytul() != "NULL")
				{
					cout << tab[i]->get_imieautora() << endl;
					cout << tab[i]->get_nazwiskoautora() << endl;
					cout << tab[i]->get_wiekautora() << endl;
					cout << tab[i]->get_zawodautora() << endl;
					cout << tab[i]->get_tytul() << endl;
					cout << tab[i]->get_dataWydania() << endl;
					cout << tab[i]->get_wydawnictwo() << endl;
					cout << tab[i]->get_cena() << endl;
					i++;
				}
				else
				{
					i = 3;
				}
			}
		}
		
		~Czytelnik()
		{
		}
};


int main()
{
	Ksiazka *nr1 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc pierwsza", "20.04.2020r", "Operon", 53.99);
	Ksiazka *nr2 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc druga", "21.04.2020r", "Operon", 53.99);
	Ksiazka *nr3 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc trzecia", "22.04.2020r", "Operon", 53.99);
	Ksiazka *nr4 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc czwarta", "23.04.2020r", "Operon", 53.99);
	Ksiazka *nr5 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc piata", "24.04.2020r", "Operon", 53.99);
	Ksiazka *nr6 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc szosta", "25.04.2020r", "Operon", 53.99);
	Ksiazka *nr7 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc siodma", "26.04.2020r", "Operon", 53.99);
	Ksiazka *nr8 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc osma", "27.04.2020r", "Operon", 53.99);
	Ksiazka *nr9 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc dziewiata", "28.04.2020r", "Operon", 53.99);
	Ksiazka *nr10 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc dziesiata", "29.04.2020r", "Operon", 53.99);
	
	Czytelnik *ob1 = new Czytelnik();
	Czytelnik *ob2 = new Czytelnik();
	Czytelnik *ob3 = new Czytelnik();
	
	ob1->set_czytelnik("Robert","Maklowicz",49,"akrobata");
	ob2->set_czytelnik("Robert","Rampowicz",59,"pisarz");
	ob3->set_czytelnik("Robert","Salatkowicz",69,"poeta");
	
	ob1->set_przypisz(0) = *nr1;
	ob1->set_przypisz(1) = *nr2;
	ob1->set_przypisz(2) = *nr3;
	
	ob1->wypiszKsiazki();
	ob2->wypiszKsiazki();
	ob3->wypiszKsiazki();
	
	nr1->Wypisz();

	delete ob1, ob2, ob3;
	delete nr1, nr2, nr3, nr4, nr5, nr6, nr7, nr8, nr9, nr10;
return 0;
}

Kod wyglada jak powyzej. Program w 90% jest skonczony i jednym problemem jest fakt, iż obiekty które tworze nie potrafie przypisać do tablicy. Czy mógłby ktoś wskazać gdzie popełniam błąd ewentualnie podpowiedzieć gdzie szukać rozwiązania/podpowiedzi? 

Pozdrawiam i życzę miłeego wieczoru

komentarz 28 kwietnia 2020 przez TOWaD Mądrala (6,000 p.)
ob1->set_przypisz(0) = *nr1; to mi wygląda dziwnie, rwartość = lwatrość i (void)= (książka) to taki tylko pomysł
komentarz 28 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)
 Ksiazka *nr1 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc pierwsza", "20.04.2020r", "Operon", 53.99);
    Ksiazka *nr2 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc druga", "21.04.2020r", "Operon", 53.99);
    Ksiazka *nr3 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc trzecia", "22.04.2020r", "Operon", 53.99);
    Ksiazka *nr4 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc czwarta", "23.04.2020r", "Operon", 53.99);
    Ksiazka *nr5 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc piata", "24.04.2020r", "Operon", 53.99);
    Ksiazka *nr6 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc szosta", "25.04.2020r", "Operon", 53.99);
    Ksiazka *nr7 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc siodma", "26.04.2020r", "Operon", 53.99);
    Ksiazka *nr8 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc osma", "27.04.2020r", "Operon", 53.99);
    Ksiazka *nr9 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc dziewiata", "28.04.2020r", "Operon", 53.99);
    Ksiazka *nr10 = new Ksiazka("Mateusz","Drozdzynski",20,"Pisarz","Chleb powszedni czesc dziesiata", "29.04.2020r", "Operon", 53.99);
     
    Czytelnik *ob1 = new Czytelnik();
    Czytelnik *ob2 = new Czytelnik();
    Czytelnik *ob3 = new Czytelnik();

To jest masochizm. Skoro korzystasz z c++, to korzystaj z jego dobrodziejstw. Bo wątpię, że przy nauce klas, nie poznałeś dynamicznych struktur danych. Musisz dodać tylko konstruktor ruchu. 

1 odpowiedź

0 głosów
odpowiedź 29 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

Można tak:

class Czytelnik : public Osoba {
protected:
    Ksiazka tab[3];
    size_t booksInTab = 0;

public:
    Czytelnik()
    {
    }

    bool set_przypisz(Ksiazka book)
    {
        if (booksInTab == 3) return false;
        tab[booksInTab++] = std::move(book);
        return true;
    }
};


...
obj->set_przypisz(Ksiazka("Mateusz", "Drozdzynski", 20, ...));

Aczkolwiek tab powinno być vectorem.

komentarz 29 kwietnia 2020 przez TOM_CPP Pasjonat (22,640 p.)

Aby std::move(book) zadziałało poprawnie.

  1. Klasa Ksiazka musi mieć zdefiniowany własny operator przenoszący, gdyż w tym przypadku domyślnie nie jest utworzony przez kompilator ( klasa posiada własną implementację destruktora ) . 
  2. Trzeba zmienić sygnaturę funkcji na
    bool set_przypisz( Ksiazka&& book )

     

komentarz 29 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
edycja 29 kwietnia 2020 przez j23
  1. W przypadku, który pokazałem, destruktor jest zbędny (u niego zresztą też nic nie robi). No ale zawsze można dodać Ksiazka& operator=(Ksiazka&&) = default; i sprawa rozwiązana.
  2. Nie trzeba, w tym przypadku wręcz nie powinno. Zastosowanie r-referencji, tak jak pokazałeś, wymusza podanie r-wartości (w domyśle metoda zawsze przenosi, a nie zawsze tego chcemy). Przekazując przez wartość i przenosząc obiekt, parametr zachowuje się jak referencja uniwersalna - jak podam l-wartość, zostanie skopiowana, a jak r-wartość - przeniesiona. Same korzyści ;)
komentarz 29 kwietnia 2020 przez TOM_CPP Pasjonat (22,640 p.)
  1.  Jest zbędny i nic nie robi, ale jest zdefiniowany, co uniemożliwia kompilatorowi wygenerowanie domyślnego operatora przenoszącego, co w tym przypadku skończy się użyciem zwykłego operatora przypisania i w efekcie kopiowaniem obiektu.
  2. "parametr zachowuje się jak referencja uniwersalna" - nie jest to do końca prawdą:  Zobacz
komentarz 29 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
  1. jeszcze raz powtórzę: w moim przykładzie go nie ma, bo nie jest potrzebny.
  2. błąd  zrobiłeś panie kolego ;) Dlaczego operator przypisania i przenoszenia zwraca kopię a nie referencję do obiektu *this?
komentarz 29 kwietnia 2020 przez TOM_CPP Pasjonat (22,640 p.)

Dlaczego operator przypisania i przenoszenia zwraca kopię a nie referencję do obiektu *this?

Tak, to jest błąd. Jak się chce za szybko coś zrobić, to takie "kwiatki" powstają (festina lente). Ale nie zmienia się sytuacji i parametr w dalszym ciągu nie zachowuje się jak referencja uniwersalna. Tutaj poprawiona  wersja. W przypadku przekazywania parametru przez lvalue wykonywane jest kopiowanie a następnie operacja przenoszenia, natomiast dla uniwersalnej referencji tylko operacja przypisania.

komentarz 29 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

Kod zachowuje się tak, jak powinien. Różnica jest w jednej operacji przenoszenia, której koszt jest praktycznie żaden. Jeśli wziąć ilość kopiowań, bo tu koszt jest największy, to jest jak uniwersalna referencja i ma niewątpliwą przewagę nad klasycznym const &.

Podobne pytania

0 głosów
1 odpowiedź 177 wizyt
0 głosów
1 odpowiedź 399 wizyt
pytanie zadane 23 kwietnia 2020 w C i C++ przez monterek4444 Początkujący (350 p.)
0 głosów
2 odpowiedzi 1,197 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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!

...