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

0 głosów
90 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 (110,100 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 (110,100 p.)
A skąd sort będzie wiedział jak porównywać obiekty typu StudentSzkoly?
komentarz 14 czerwca 2018 przez RafalS VIP (110,100 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 (110,100 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 (110,100 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ź 82 wizyt
pytanie zadane 21 czerwca 2018 w C i C++ przez Sic Mądrala (7,370 p.)
0 głosów
2 odpowiedzi 242 wizyt
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

63,340 zapytań

109,599 odpowiedzi

228,959 komentarzy

44,170 pasjonatów

Przeglądających: 203
Pasjonatów: 7 Gości: 196

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...