Hierarchia klas C++

0

Witam! Na przyszły wtorek mam do napisania projekt w C++, a że jeśli chodzi o informatykę to jestem raczej teoretykiem (co jednak w najbliższej przyszłości postaram się zmienić :>), proszę o pomoc. W żadnym wypadku nie chcę, aby ktokolwiek pisał za mnie program. Na początek proszę tylko o parę wskazówek jak się do tego zabrać, od czego zacząć, ile tych klas zaimplementować i w jaki sposób najlepiej, czy implementować 12 różnych klas i dodatkowe do obsługi itp. Jeżeli będę miał jakikolwiek problem z samym kodem, to wtedy będę prosił np. o zaklepanie jakiejś metody, na razie chcę spróbować sam, więc oczekuję porad ogólnych. ;) A oto treść samego projektu:

Schemat przedstawia hierarchię klas (na samym dole). Każdy prostokąt reprezentuje jedną klasę. Klasy położone niżej dziedziczą z klas położonych wyżej zgodnie z siecią połączeń. Nazwy klas można modyfikować. Należy:

  • zdefiniować poszczególne składowe każdej z klas (pola i metody) - nazwy i liczność pól i metod są zależne od realizującego
  • określić sposób dziedziczenia klas, czyli zaimplementować przedstawioną hierarchię

Jako liść rozumiana jest klasa, która nie ma potomka.

Program powinien umożliwiać następujące operacje na zbiorze obiektów:

  • dodawanie obiektu(tylko do liści)
  • usuwanie obiektu(tylko z liści)
  • modyfikacje obiektu
  • zapis zbioru do pliku
  • odczyt zbioru z pliku
  • przeglądanie podzbioru obiektów zgodnie z przedstawioną na rysunku hierarchią - z dowolnego węzła drzewa, wyświetlane zostaną tylko obiekty należące do liści, które z danego węzła dziedziczą, lub w przypadku liścia - jedynie obiekty do niego należące
  • każda klasa powinna posiadać przynajmniej 1 pole prywatne i protected

Poruszanie się w strukturze z linii komend:

  1. W systemie znajdują się obiekty
  2. Tylko liść zawiera w sobie listę obiektów (długość listy jest nieograniczona)
  3. Struktura - operacje:
  • CD [nazwa węzła(klasy)] - zmiana węzła w strukturze
  1. Obiekty - operacje:
  • MO [obiekt] - tworzy obiekt o nazwie "obiekt" dla bieżącego liścia - należy podać parametry obiektu
  • DO [obiekt] - usuwa obiekt o nazwie "obiekt" dla bieżącego liścia
  • MDO [obiekt] - modyfikacja obiektu o nazwie obiekt dla bieżącego liścia
    • Polecenie DIR - wyświetla informacje o obiektach widocznych z danego poziomu - domyślnie tylko informacje o nazwach obiektów (wyświetla listę wszystkich obiektów należących do liści, które dziedziczą z danej klasy)
  • Polecenie SHOW [obiekt] - wyświetla szczegółowe informacje o obiekcie
  • SAVE - zapis zbioru do pliku
  • READ - odczyt zbioru z pliku
  • Polecenie TREE - wyświetla całą strukturę widoczną na rysunku, np w formie wcięć
  1. Zapis i odczyt informacji ma być zrealizowany za pomocą strumieni

Oto symboliczny rysunek hierarchii (przepraszam za jakość, ale powinno wystarczyć) :
user image

z jakiegoś powodu obrazek nie chce się wyświetlić, wystarczy wkleić link do przeglądarki

0

No dobrze, ale gdzie pytanie? Może przedstaw jakąś propozycję co do pól i metod.

0

No właśnie na tym polega cały haczyk i po to powstał ten temat, żebym to ja wysłuchał jakichkolwiek propozycji :). Nie chcę wychodzić tutaj na nieroba, ja po prostu niezbyt wiem z której strony mam się za to zabrać, co zrobić najpierw, co potem i tak dalej... Nie wiem, czy mam implementować 12 różnych klas oznaczonych literkami alfabetu a później jakieś klasy do obsługi (jeśli tak się da), czy jakoś inaczej. Czy może np osobne klasy "przeglądanie", "dodawanie" i inne tego typu do obsługi. No i jak zrobić, by można było wpisywać te polecenia (bo o ile się orientuję to np switchem nie można bo on działa tylko na cyfrach)

0

(bo o ile się orientuję to np switchem nie można bo on działa tylko na cyfrach)

Na prawdę? Gdzie to wyczytałeś? Przeczytaj jeszcze raz ;P

Na początek zidentyfikowałbym klasy jakie są potrzebne do stworzenia struktury. Moja propozycja na początek:
Node - klasa reprezentująca element w strukturze drzewa
Root - korzeń, dziedziczy po node
Leaf - liść, dziedziczy po node
Data - obiekt danych

Node udostępnia metody wspólne dla korzenia i liści
Root posiada wskaźniki tylko do dzieci
Leaf posiada wskaźniki do rodziców, ale nie może mieć dzieci

W zasadzie roota można pominąć. Może to być Node bez rodzica.

EDIT: Sory za dubel. Przydała by się możliwość usunięcia własnego świeżego posta

0

Hejka!

Ze wszystkim sobie jednak poradziłem, oprócz jednego. Mianowicie chodzi o wczytywanie obiektów z pliku. Mój plik przyjmuje np. taką postać:

E epierwszy  .
E edrugi  .
H hpierwszy poleprot .
K kpierwszy  .
L lpierwszy  klux.

gdzie literka to nazwa klasy, potem po spacji nazwa, po spacji pole protected i po kolejnej pole priv (nie wszystkie pola są tu uzupełnione, pozostają po prostu puste).
Kropeczka wstawiana jest zawsze na końcu przy zakończeniu ZAPISU obiektu do pliku.
Moja funkcja do odczytywania tego pliku wygląda tak:

void Obsluga::wczytanieZPliku(string plik1) {
	string temp, temp2;
	
	fstream plik;
	plik.open(plik1, ios::in);

	while(!plik.eof()) {
		plik >> temp;
		ustAktualnyWezel(temp);
		plik >> temp2;
		this->robObiekt(temp2);
		cout << temp;
	}

}

gdzie ustAktualnyWezel zmienia klasę w jakiej aktualnei znajduje się program, a robObiekt jak łatwo się domyślić tworzy nowy obiekt danej klasy.
Problem polega na tym, że nie wszystkie obiekty tworzą się tak jak powinny (brakuje np. obiektu klasy L i jednego z E), a dodatkowo żaden nie ma ustawionych pól protected i private.
Mogę prosić o jakąś pomoc? ;)
W razie potrzeby dostarczę jakiś inny fragment kodu, albo nawet cały (choć tego raczej postował nie będę, bo to 15 plików i chyba ponad 2000 linii...).

EDIT:
Błąd nie tylko polega na złym zapisie tej metody zapisującej (bo pewnie na tym też polega), ale także na sposobie w jaki tworze obiekty w metodzie robObiekt. I nie wiem za bardzo jak to zmienić, żeby zaraz nie zmieniać całego programu...

void Obsluga::robObiekt(string nazwa) {                 //TWORZENIE NOWEGO OBIEKTU
	if (wezAktualnyWezel() == "E") {
		E::dodajOb(nazwa);
	}
	else if (wezAktualnyWezel() == "F") {
		F::dodajOb(nazwa);
	}
	else if (wezAktualnyWezel() == "G") {
		G::dodajOb(nazwa);
	}
	else if (wezAktualnyWezel() == "H") {
		H::dodajOb(nazwa);
	}
	else if (wezAktualnyWezel() == "K") {
		K::dodajOb(nazwa);
	}
	else if (wezAktualnyWezel() == "L") {
		L::dodajOb(nazwa);
	}
	else {
		cout << "Nie mozesz tworzyc obiektow dla wezla " << wezAktualnyWezel() << endl;
	}
}

w taki sposób tworzę obiekty, mając 6 klas które mają w sobie metodę dodajOb(nazwa). Wygląda ona dokładnie tak (dla przykładowej klasy):

void F::dodajOb(string nazwa) {
		F tymczasowy(nazwa);
		F::lista.push_back(tymczasowy);

		cout << "Dodano obiekt: " << nazwa << endl;
}

Jak widać tylko nazwa jest ustalana tym konstruktorem ;/. pola protected i prywatne wyglądają w nim odpowiednio protF = ""; privF = "";
Reasumując - jestem w kropce, a mam czas do 24:00 :).

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