Klasa zagnieżdzona c++

0

Witam,
Mam za zadanie napisać klasę Student oraz zagniezdzona w niej klase Przedmiot. Mam dodatkowo również zdefiniować 2 metody dodajOcene i zmienOcene. Udało mi się napisać taki kod:

#include <iostream>
#include <cstring>
using namespace std;
class Student{
public:
char* imie;
char* nazwisko;
int wiek;
Student(){
imie="andrzej";
nazwisko="kowalski";
wiek=22;
}
class Przedmiot{
public:
char* nazwa;
double ocena;
Przedmiot(char*nazwa,double o){
this->nazwa=nazwa;
ocena=o;
}

};
Przedmiot* dodajOcene(char* nazwa,double ocena){
Przedmiot* p=new Przedmiot(nazwa,ocena);
return p;
}
void zmienOcene(Przedmiot& p,double o){
p.ocena=o;
}
};
int main ( ) {
Student s=Student();
cout<<s.imie<<s.nazwisko<<s.wiek<<endl;
Student::Przedmiot* wp=s.dodajOcene("Polski",3);
s.zmienOcene(*wp,5);
return 0 ;
} 

Czy ro rozwiązanie jest poprawne ?

0

Sformatuj ten kod porządnie, to może ktoś go w ogóle przeczyta...

0
#include <iostream>
#include <cstring>
using namespace std;
class Student{
public:
char* imie;
char* nazwisko;
int wiek;
Student(){
	imie="andrzej";
	nazwisko="kowalski";
	wiek=22;
	}
		class Przedmiot{
		public:
		char* nazwa;
		double ocena;
		Przedmiot(char*nazwa,double o){
			this->nazwa=nazwa;
			ocena=o;
			}
		};
Przedmiot* dodajOcene(char* nazwa,double ocena){
	Przedmiot* p=new Przedmiot(nazwa,ocena);
	return p;
}
void zmienOcene(Przedmiot& p,double o){
	p.ocena=o;
}
};
int main ( ) {
Student s=Student();
cout<<s.imie<<s.nazwisko<<s.wiek<<endl;
Student::Przedmiot* wp=s.dodajOcene("Polski",3);
s.zmienOcene(*wp,5);

return 0 ;
} 
0
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Student{
	int checkPrzedmiot(string nazwa) {
		size_t i;
		for(i = 0; i < przedmioty.size(); i++)
			if(przedmioty[i]->getNazwa() == nazwa)
				break;
		if(i != przedmioty.size())
			return i;
		return -1;	
	}

	class Przedmiot{
        public:
        	string nazwa;
        	vector<double> oceny;
        	Przedmiot(string nazwa){
        		this->nazwa = nazwa;
        	}
		string getNazwa() { return this->nazwa; }
		void addOcena(double x) { oceny.push_back(x); }
		void changeOcena(size_t index, double x) {
			if(index >= 0 && index < oceny.size())
				oceny[index] = x;
		}
		void display() {
			for(size_t i = 0; i < oceny.size(); i++)
				cout << oceny[i] << " ";
		}
        };
	vector<Przedmiot*> przedmioty;
public:
	string imie;
	string nazwisko;
	unsigned wiek;
	
	Student(){
        	imie="andrzej";
	        nazwisko="kowalski";
	     	wiek=22;
	}

	~Student() {
		for(size_t i = 0; i < przedmioty.size(); i++)
			delete przedmioty[i];
		przedmioty.clear();
	}

	void dodajPrzedmiot(string nazwa) {
		for(size_t i = 0; i < przedmioty.size(); i++)
			if(przedmioty[i]->getNazwa() == nazwa)
				return;
		przedmioty.push_back(new Przedmiot(nazwa));
	}
        
	void dodajOcene(string nazwa,double ocena){
		if(checkPrzedmiot(nazwa) != -1)
			przedmioty[checkPrzedmiot(nazwa)]->addOcena(ocena);
	}
	void zmienOcene(string nazwa, size_t index, double ocena){
		if(checkPrzedmiot(nazwa) != -1)
			przedmioty[checkPrzedmiot(nazwa)]->changeOcena(index, ocena);
	}

	void display() {
		for(size_t i = 0; i < przedmioty.size(); i++)
			przedmioty[i]->display();
	}
};
int main ( ) {
	Student a;
	a.dodajPrzedmiot("Matematyka");
	a.dodajOcene("Matematyka", 4.17);
	a.zmienOcene("Matematyka", 0, 3);
	for(int i = 0; i < 15; i++) {
		a.dodajOcene("Matematyka", i);
	}
	a.zmienOcene("Matematyka", 7, 1000);
	
	a.display();
	return 0 ;
} 

Pisane na szybko.

0

Tak to rozwiązanie jest poprawne. Nie rozumiem tej linijki:
Student s=Student();
wystarczy przecież napisać:
Student s;
Tworzy się nie potrzebnie obiekt tymczasowy i zostaje on skopiowany do drugiego obiektu. Chociaż nie wiem czy kompilator tego nie zoptymalizuje i nie stworzy obiektu tymczasowego.
Druga uwaga nie odnosimy się bezpośrednio do pól klasy tylko przez funkcję składowe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1