Dziedziczenie klas C++

0

Należy:
 zdefiniować poszczególne składowe każdej z klas (pola i metody) – nazwy i liczność pół i metod są zależne
od osoby realizującej projekt;
 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:
o dodawanie obiektu (tylko do liści);
o usuwanie obiektu (tylko z liści);
o modyfikacje obiektu;
o zapis zbioru do pliku;
o odczyt zbioru z pliku;
o 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
o Każda klasa powinna posiadać co najmniej 1 pole prywatne i 1 pole 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
  1. 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
  2. Polecenie TREE - wyświetla całą strukturę przedstawioną na rysunku np. w formie wcięć
  3. Zapis i odczyt informacji na dysk i konsole ma być zrealizowany za pomocą strumieni.

Czesc dopiero zaczynam przygode z programowaniem więc prosze o wyrozumialosc. Mam taki projekt na zaliczenie.
Powiedzmy ze mam :

class Pojazd{
};
class Pojazdsilnikowy:Pojazd{
};

oczywiscie w srodku jakies zmienne, ale jak dodac obiekt np. do pojazdsilnikowy tak aby mozna było dodawac z poziomu uzytkownika, czyli np. zrobilbym metode Dodaj(); ale jak wtedy odwolac sie do niej z main? tak aby mozna bylo dodawac nieokreslona ilosc obiektow?

I jeszcze jedno pytanie co do tych polecen cd mo itd: jak ma to dzialac? musze zrobic funkcje sprawdzic czy uzytkownik wpisuje np. cd i wtedy odniesc sie do dodawanie? czy to są jakies specjalne komendy ktorych nie trzeba pisac?

0

Ja to rozumiem tak:

W mainie powinieneś mieć jakiś kontener, który przechowuje obiekty - poleciłbym ci std::vector, powinien on być typu klasy, z której dziedziczysz np.: std::vector<Pojazd>
Tworzysz sobie jakieś menu, które spełnia założenia programu: Dodaj pojazd, usuń pojazd, zapisz do pliku etc.
Zaimplementować metody z menu np:

void dodaj()
{
// pobierz od użytkownika wartości do pojazdu (typ, moc silnika, ilość KM etc)
stwórz nowy obiekt i dodaj go do vectora z maina.
}

i tak z całą resztą.

O ile dobrze zrozumiałem o co pytasz oraz treść zadania.

0

czyli void dodaj() ma byc wewnatrz klas pochodnych?
nie wiem wlasnie jak dodac ten obiekt i wrzucic go do tego vectora
wiem ze nowe obiekty mogę tworzyc np tak:
Pojazdsilnikowy obiekt;
obiekt.zmienna = ...
ale jak to zrobic zeby mozna bylo dodawac wiecej elementow i nie musiec kazdego tak po kolei?
mam nadzieje ze dobrze wytlumaczylem, chodzi mi o to ze jak sie odwolam :
obiekt.Dodaj();
to doda mi tylko jeden obiekt o zmiennych jakie wpisze uzytkownik

0

Sądzę, że autorowi zadania chodzi o zastosowanie dziedziczenia i polimorfizmu. W takim wypadku obiekty nie tworzysz w ten sposób, który pokazałeś, a np. przez operator new.
Pojazd *obiekt = new PojazdSilnikowy();

Wypadałoby stworzyć konstruktor parametryczny dla tych klas, spytać użytkownika o te parametry, sprawdzić ich poprawność (np. żeby użytkownik nie podał liczby ujemnej do koni mechanicznych) i dodać obiekt do vectora.

vector.push_back(new PojazdMechaniczny(param1, param2, param3...));

0

Nadal robie cos zle, gdy wczytam najpierw wartosci parametrow i nastepnie robie tak jak napisales wyskakuje mi błąd przy
vector.push_back(new PojazdMechaniczny(a,b,c)); ERROR missing template arguments before '.' token

0

i jeszcze pytanie czy jak w tworzeniu nowego obiektu będzie Pojazd *obiekt = new Pojazd();
to czy nie będzie to jeden obiekt? i jak będe chciał dodac drugi to nie dodam znowu danych do tego obiektu??

1

vector to szablon z namespac std a nie zmienna.
potrzebujesz instancję std::vector z określeniem typu jaki zawiera.

Kod poprzedzaj linijką: ```cpp
i kończ linijką: ```

1
wyebani napisał(a):

Ja to rozumiem tak:

W mainie powinieneś mieć jakiś kontener, który przechowuje obiekty - poleciłbym ci std::vector, powinien on być typu klasy, z której dziedziczysz np.: std::vector<Pojazd>
Tworzysz sobie jakieś menu, które spełnia założenia programu: Dodaj pojazd, usuń pojazd, zapisz do pliku etc.
Zaimplementować metody z menu np:

Kontener na typie podstawowym (można powiedzieć przekazywanym przez wartość) nie pozwala na skorzystanie z polimorfizmu swoich elementów. Czyli

std::vector<Pojazd>

jest źle

a dobre mogą być

std::vector<Pojazd*>

albo

std::vector<Pojazd&>
inf0101123 napisał(a):

i jeszcze pytanie... Pojazd *obiekt = new Pojazd();

Ten fragment polimorficznie to

Pojazd * poj = new Cieżarówka();

jeśli klasa pojazd jest bazową, być może jest / powinna być abstrakcyjna i new nie da się zrobić i/albo to nie ma sensu

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