• 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?

VPS Starter Arubacloud
0 głosów
589 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 WhiteDragon Początkujący (290 p.)
Właśnie wymaganiem w zadaniu jest przyjaźń tylko z klasą Student,stąd problem-nie wiem jak to ugryźć...
komentarz 14 czerwca 2018 przez RafalS VIP (122,820 p.)
Po pierwsze, ta przyjaźń w tej wersji nic nie wnosi :D Masz wszystko publiczne, gdybyś miał składowe prywatne to wtedy miałbyś do nich dostęp, a bez przyjaźni byś nie miał.

Po drugie, dziedziczenie z przyjaźnią sie nie wykluczają. Dodaj to dziedziczenie i będziesz miał wszystkie pola, które chcesz mieć.
komentarz 14 czerwca 2018 przez WhiteDragon Początkujący (290 p.)
Ok,no to daje dziedziczenie do person i student to co dalej? Nie za bardzo miewałem do czynienia z takimi tablicami...
komentarz 14 czerwca 2018 przez RafalS VIP (122,820 p.)
Po co do person. Student dziedziczy po person, więc jak podziedziczysz po Studencie to automatycznie dostaniesz też Person.
komentarz 14 czerwca 2018 przez RafalS VIP (122,820 p.)
StudentSzkoly::StudentSzkoly()
{
	cout << "Podaj ID:" << " "; cin >> id;
	download_data(); //wywolanie funkcji odziedziczonej ze Student
	//mozna wywolac jawnie download data z klasy Student:
	// Student::download_data();
	//w klasie Person metoda pobierająca dane nazywa sie tak samo, wiec tym
	//razem zeby sie do niej odniesc trzeba dodać operator zakresu:
	Person::download_data();

};

tak by mógł wyglądać konstruktor klasy StudentSzkoly. Wtedy przy stworzeniu obiektu musiałbyś podać wszystkie pola.

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

Lub trzmyając sie konwencji z download data mógłbyś zrobić tak:

	void download_data() {
		cout << "Podaj ID:" << " "; cin >> id;
		Student::download_data();
		Person::download_data();
	}

w klasie StudentSzkoly

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

A potem w mainie pobrać ilość, stworzyć tablicę - dynamicznie przy pomocy new i pobrać dane dla kazdego studenta:

	int iloscStudentow;
	cout << "Podaj liczbe studentow" << endl;
	cin >> iloscStudentow;
	StudentSzkoly *studenciSzkoly = new StudentSzkoly[iloscStudentow];
	for (int i = 0; i < iloscStudentow; i++)
	{
		studenciSzkoly[i].download_data();
	}

 

komentarz 14 czerwca 2018 przez WhiteDragon Początkujący (290 p.)

O super,dzięki za wytłumaczenie! Jeszcze tylko pytanko małe-sortować mogę to według id zwykłą funkcją sort pisząc:

sort(tablica,tablica+ilosc);

Czy trzeba do tego innego podejścia?

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ź 374 wizyt
pytanie zadane 21 czerwca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
2 odpowiedzi 489 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...