Lista dynamiczna w obiektowym C++

0

Do klasy MojaKlasa (Program #6) dodaj pole nast, tak aby można było tworzyć listę dynamiczną jednokierunkową obiektów typu MojaKlasa.

Następnie zaprojektuj nową klasę Wykladowca, która zawiera pole typu MojaKlasa* wskazujące na listę dynamiczną jednokierunkową. Pole to ma pełnić rolę głowy dynamicznej listy grup studenckich przypisanych do danego wykładowcy. Klasa Wykladowca może też zawierać inne pola, jeżeli okażą się potrzebne.

Do klasy Wykladowca dodaj konstruktory:

konstruktor domyślny, inicjalizujący obiekt tak, aby lista dynamiczna była pusta.
konstruktor z argumentem reprezentującym nazwę pliku tekstowego. Plik zawiera listę kilku adresów e-mail. Konstruktor tworzy jeden obiekt dynamiczny typu MojaKlasa, do którego zostają zapisane adresy e-mail odczytane z pliku. Następnie obiekt ten jest dołączany do listy dynamicznej.
konstruktor kopiujący, który tworzy kopię listy dynamicznej z obiektu podanego w argumencie wywołania.
oraz destruktor, który zwalnia wszystkie dynamicznie zaalokowane zasoby.

Kod programu:

#include <cstdio>
#include <cstring>
using namespace std;

class MojaKlasa {
	char **email; 
	int ile;
	public:
	MojaKlasa(int x);
	MojaKlasa(MojaKlasa& mk);	// konstruktor kopiujący
	void setemail(char* adres, int idx) { strcpy(email[idx],adres); }
	char* getemail(int idx) { return email[idx]; }
};
MojaKlasa:: MojaKlasa(int x) {
	email = new char*[ile = x];
	for (int i=0;i<ile;i++) email[i] = new char[100];
}

MojaKlasa::MojaKlasa(MojaKlasa& mk) {
	email = mk.email;			// czy to jest OK?
}
/*
MojaKlasa::MojaKlasa(MojaKlasa& mk) {
	email = new char*[mk.ile];
	ile = mk.ile;
	for (int i=0;i<ile;i++) {
		email[i] = new char[100];
		strcpy(email[i],mk.email[i]);
	}
}
*/
int main() {
	MojaKlasa MK(3);
	MK.setemail("[email protected]",0);
	MojaKlasa MK2(MK);
	printf("%s\n", MK2.getemail(0));
	MK.setemail("[email protected]",0);
	printf("%s\n", MK2.getemail(0));
	return 0;
}

Nie wiem jak tworzyć takie listy dynamiczne obiektowe w C++, nie umiem zrobić tych konstruktorów.

3

Możesz wykładowcę poinformować, że jak już minie rok 2000 (bo wyraźnie zatrzymał się przed), to C++ znacząco się zmieni!

Skoro takie masz zadanie, to nie masz wyboru. Spróbuj osobno sobie pierw zaimplementować listę jednokierunkową, a dopiero potem wplataj ją w istniejacą klasę.

Swoją drogą, to jest zły design, wykładowca robi wam krzywdę pakując to do głowy

2
kq napisał(a):

Możesz wykładowcę poinformować, że jak już minie rok 2000 (bo wyraźnie zatrzymał się przed), to C++ znacząco się zmieni!
Skoro takie masz zadanie, to nie masz wyboru. Spróbuj osobno sobie pierw zaimplementować listę jednokierunkową, a dopiero potem wplataj ją w istniejacą klasę.
Swoją drogą, to jest zły design, wykładowca robi wam krzywdę pakując to do głowy

No bo można użyć gotowego kontenera. O to ci chodzi? Tylko że to nie komercyjny projekt, w którym po prostu bierze się gotowce.
Celem dydaktycznym zadania jest zapewne implementacja dynamicznej listy jednokierunkowej, a nie wykorzystanie kontenerów z biblioteki standardowej czy maksymalizacja wykorzystania elementów języka C++ ustandardyzowanych po roku 2000.

0

Można użyć konetnera, ale nie o to chodzi. Nie należy uczyć:

  • używania nagiego new bez powodu
  • łamania SRP i tworzenia intrusive list - ta optymalizacja rzadko kiedy ma sens, a na pewno nie przy nauce podstaw
2

Celem dydaktycznym zadania jest zapewne implementacja dynamicznej listy jednokierunkowej

@Azarien No właśnie niekoniecznie. Gdyby tak było wykładowca nie mieszał by do zadania klas i konstruktorów. Wygląda na to, że wykładowca zatrzymał się na etapie C z klasami co jest okropną praktyką bo zachował wszystkie limity jakie narzuca C i do tego narzucil mechanizmy C++, które w niczym nie pomagają i tylko dorzucają dodatkowy kod, który nie rozwiązuje żadnych problemów.

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