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

Tablica obiektów pochodzących z różnych klas?

Object Storage Arubacloud
0 głosów
628 wizyt
pytanie zadane 14 czerwca 2018 w C i C++ przez WhiteDragon Początkujący (290 p.)

Załóżmy,że mam klasę Person. Ona jest klasą podstawową i jej głównym zadaniem jest proszenie użytkownika o imię,nazwisko i wiek oraz pobranie tych wartości.

Druga klasa to Student-pyta i pobiera numer grupy. Dziedziczy od Person.

Klasa StudentSzkoły-zaprzyjaźniona z klasą Student. Przyjmuje wartość ID.

Mam stworzyć tablicę obiektów klasy StudentSzkoły (ilość danych do wpisania to decyzja użytkownika,zatem musi być dynamiczna) w której będzie imie,nazwisko,wiek,ID.

Potem będę to sortować według ID ale jak naraze sam akt twórczy tej tablicy mi nie wychodzi. Co poradzicie?

 


#include "stdafx.h"
#include <iostream>
#include <string>


using namespace std;

class Person
{
private:
	void show()
	{
		cout << imie << " " << nazwisko;
	}
public:
	int wiek;
	string imie, nazwisko;
	void download_data()
	{
		cout << "Podaj imie:" << " "; cin >> imie;
		cout << "Podaj nazwisko:" << " "; cin >> nazwisko;
		cout << "Podaj wiek:" << " "; cin >> wiek;
		show();
	}
	Person();
};
Person::Person()
{

};

class Student:public Person
{
private:
	void show()
	{
		cout << grupa;
	}
public:
	int grupa;
	void download_data()
	{
		cout << "Podaj numer grupy" << " "; cin >> grupa;
		show();
	}
	friend class StudentSzkoly;
	Student();
};
Student::Student()
{

};
class StudentSzkoly
{ 
public:
	int id;
	cout << "Podaj ID:" << " "; cin >> id;
	StudentSzkoly();
};
StudentSzkoly::StudentSzkoly()
{

};
int main()
{
	Person person = Person();
	person.download_data();
	Student student = Student();
	student.download_data();

    return 0;
}

 

 

1 odpowiedź

0 głosów
odpowiedź 14 czerwca 2018 przez RafalS VIP (122,820 p.)

Zacznijmy od tego, że ta linijka:

cout << "Podaj ID:" << " "; cin >> id;

w ciele klasy nie ma sensu i dodatkowo się nie kompiluje. To powinno wylądować w odpowiedniej metodzie, analogicznie do poprzednich klas.

Mam stworzyć tablicę obiektów klasy StudentSzkoły

Skoro tak to tablica nie będzie różnych obiektów.

Jeśli ta przyjaźń nie jest wymaganiem zadania to nie wiem skad taki pomysł. Tym bardziej, że składowe są u Ciebie publiczne i każdy bez przyjaźni ma do nich dostęp.

...klasy StudentSzkoly... w której będzie imie,nazwisko,wiek,ID.

Hmm naturalnym podejściem byłoby podziedziczenie z klasy Student. Wtedy dodałbyś tylko pole ID i miałbyś wszystkie składowe które potrzebujesz.

komentarz 14 czerwca 2018 przez RafalS VIP (122,820 p.)
A skąd sort będzie wiedział jak porównywać obiekty typu StudentSzkoly?
komentarz 14 czerwca 2018 przez RafalS VIP (122,820 p.)

Można to zrobić na dwa sposoby. Albo podać sortowi funkcje porównującą dwa obiekty typu StudentSzkoly, albo przeciążyć operator < dla tej klasy. Myślę, że dla Ciebie będzie łatwiej napisać funkcję porównującą:

bool compareStudents(const StudentSzkoly& student1, const StudentSzkoly& student2) {
	return student1.id < student2.id;
}

a potem przesyłasz tą funkcje jako 3 argument sorta:

std::sort(studenciSzkoly, studenciSzkoly + iloscStudentow, compareStudents);

Wersja z przeładowaniem operatora, jako publiczna metoda klasy StudentSzkoly:

	bool operator<(const StudentSzkoly& s) {
		return id < s.id;
	}

wtedy sort wywołujesz bez trzeciego parametru

komentarz 14 czerwca 2018 przez RafalS VIP (122,820 p.)

Jest też trzecia wersja :D. Zamiast deklarować funkcję przy wywołaniu sorta dodajemy funkcję lambda, czyli nienazwaną funkcję:

	sort(studenciSzkoly, studenciSzkoly + iloscStudentow,
		[](const StudentSzkoly& s1, const StudentSzkoly& s2) {return s1.id < s2.id; });

Dodaje jako ciekawostka, bo pewnie i tak nie wykorzystasz :P

komentarz 14 czerwca 2018 przez RafalS VIP (122,820 p.)
Jeszcze taki komentarz do przeładowania operatora, bo pewnie nie wiesz co to :P.

Działa to tak, że definiujesz co kompilator ma zrobić gdy zobaczy obiektTwojejKlasy < innyObiektTwojejKlasy. sort wtedy zadziała bo on w środku w implementacji porównuje obiekty własnie w ten sposób.
komentarz 14 czerwca 2018 przez WhiteDragon Początkujący (290 p.)

Jak ty mnie znasz xDD

Używam sposobu pierwszego ale kiedy robię obiekt by wywołać funkcję i poprzez obiekt dajmy na to student wywołuję funkcję to ta prosi o jakieś argumenty w wywołaniu funkcji. O co może chodzić? ID,student1 /student 2 czy co?

Bez wywołania sort się nie zrobi bo funkcja compareStudents jest niezdefiniowana

Podobne pytania

0 głosów
1 odpowiedź 389 wizyt
pytanie zadane 21 czerwca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
2 odpowiedzi 503 wizyt

92,566 zapytań

141,420 odpowiedzi

319,604 komentarzy

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

...