• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziedziczenie, prywatna funkcja sortująca klasy pochodnej dla atrybutów klasy bazowej.

Object Storage Arubacloud
0 głosów
570 wizyt
pytanie zadane 2 stycznia 2017 w C i C++ przez wanttobeanengineer Obywatel (1,120 p.)

Dzień dobry.

Mam pewien problem.
Otóż posiadając klasę A, której jednym z atrybutów jest tablica elementów typu double (public), tworzę klasę B, która jest pochodną klasy A. Klasa B poza elementami odziedziczonymi posiada tylko metodę sortującą (private). 
Klasa A natomiast posiada szereg metod i funkcji zaprzyjaźnionych (przeciążenia operatorów, alokowanie tablicy double, dodawanie elementu do tej tablicy, zmienianie rozmiaru itd.), które zmieniają długość/wartości tej tablicy. 
Klasa B ma być niemalże identyczna do A z tym wyjątkiem że ma przechowywać w tej tablicy elementy posortowane. Czyli przy każdym wywołaniu funkcji, która została napisana dla A i odziedziczone przez B, ma na bieżąco sortować tablicę z obiektu klasy B.

 

class A
{
public:
  double *t;
  int size;
  .
  .
  .
  void operator = (const A&);
  double& operaotr [](const int);
  void set_size(const int);
  void dodaj(const double);
  friend istream& operator >> (istream&, A&);
};

class B:public A
{
private:
  void sort();
  .
  .
  .
};

Przeładowanie operatora = nie zmienia jego zasady działania (tzn po prostu do jednego obiektu przypisuje drugi)
Przeładowanie operatora [] również nie zmienia (Obiekt[2] pozwala odnieść się do 3 elementu tablicy tej klasy)
funkcja set_size() ustawia nowy rozmiar, elementy tablicy nie są zamazywane a jeśli rozmiar jest większy od obecnego to dopisywane są zera
funkcja dodaj() dodaje element na końcu tablicy
operator >> również nie zmienia zasady działania, wczytuje po prostu do tablicy podane wartości

Moje pytanie jest takie:
Czy da się zrobić tak, aby klasa B dziedziczyła z A i posiadała tylko prywatną metode sort() oraz swoje konstruktory i destruktor, a mimo to po wywołaniu opisanych wyżej funkcji elementy w tablicy na bieżąco się sortowały?

Bo raczej nie chodzi o to, żeby przepisywać drugi raz te same metody skoro to jest dziedziczenie. 
Mogę to zrobić w taki sposób, że piszę definicje metody drugi raz dla klasy B i w niej zamiast pisać całego ciała tej metody to wywołuje odpowiadającą jej metodę klasy A a później funkcję sort(), ale takie rozwiązanie również chyba nie ma sensu.

Jak inaczej mogę to rozegrać aby przy każdym odniesieniu się do obiektu klasy B była wywoływana funkcja sort.
 

A Oa;
B Ob;

Ob = Oa;  // Od razu sortuje tablice która leci do Ob
Ob[3] = 5; // I sortowanie..
Ob.dodaj(); // Sortowanie..
Ob.set_size(5); // Sortowanie..

cin >> Ob; // I tu też sortuje..

 

2 odpowiedzi

0 głosów
odpowiedź 2 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

Sposobów jest kilka, między innymi te które już wymieniłeś.

Skoro chcesz, aby tutaj Ob = Oa; była wywoływana funkcja sort(), to w w ciele konstruktora kopiującego dopisz Sort(). Nie będzie to najprostsze rozwiązanie? I musisz także pamiętać o wywołaniu konstruktora przypisania w klasie pochodnej z referencją na klasę bazową, skoro kopiujesz obiekt klasy bazowej do obiektu klasy pochodnej.

komentarz 2 stycznia 2017 przez wanttobeanengineer Obywatel (1,120 p.)

Nie o to..

Hmm..
 

class A
{
public:
  double *t;
  int size; // przechowuje faktyczna liczbe elementow w tablicy t
  A(){ //Konstruktor tworzy tablice liczb}
  void dodaj(double el)
  {
    t[size] =el;
    size++;
  }
}

class B: public A
{
  private:
    sort()
    {  // Tutaj tylko kod sortujacy tablice
    }
};


int main()
{ A a;
  // Niech a będzie obiektem klasy A z tablica liczb[0,1,2,3,4,5,6,7]
  B b;
  // Niech b będzie obiektem klasy B z taką samą tablicą liczb
  a.dodaj(3.5);
  b.dodaj(3.5);
   cout<<a; // Tu powinno wyświetlić tablicę [0,1,2,3,4,5,6,7,3.5]
   cout<<b; // A tutaj [0,1,2,3,3.5,4,5,6,7], czyli posortowaną
   // ALE UŻYWAJĄC JEDNEJ METODY, z tym że taką operacje przeprowadzić
   // żeby wykorzystać metodę sort() z klasy B już na tablicy
   // z dodanym elementem
}

Czyli funkcja dodaj() jest definiowana TYLKO w klasie A i z niej dziedziczona do klasy B.
Klasa B może ją wykorzystać bo to metoda publiczna, ale jeśli ją wykorzysta to po wstawieniu tego elementu na koniec, zostaje tablica z klasy B posortowana.

komentarz 2 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

Tworzysz dwa obiekty: jeden klasy A, drugi klasy B. Najpierw tworzymy pierwszy obiekt klasy A: A a(konstruktor klasy A);. Następnie tworzymy obiekt klasy B: B b(konstruktor klasy B);.

Chcesz następnie dodać jakąś liczbę do obiektu klasy A, wywołujesz metodę dodaj().

Następnie chcesz dodać tę samą liczbę do obiektu klasy B, wywołujesz metodę dodaj().

I nie wiem o co Ty chcesz dalej zrobić, w którym momencie w ogóle tablicę posortować, skoro nigdzie nie wywołujesz metody b.sort().

komentarz 2 stycznia 2017 przez wanttobeanengineer Obywatel (1,120 p.)

Już blisko jesteśmy :D
Właśnie o to pytam gdzie wywołać tą metodę sort()
b.sort() nie da się bo to metoda prywatna.
Wiec w jaki sposób to posortować. 
Bo zostaje mi tylko przeładować dodaj() na rzecz klasy B i w tym przeładowaniu sortować, ale np. mam też przeładowanie operator [] i tu już jest problem, bo nie mam pojęcia jak w tej funkcji posortować tablicę po umieszczeniu przez nią elementu pod indeksem.

komentarz 2 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

A czy funkcja sort() z klasy B musi być prywatna? Tak sobie wymyśliłeś, aby utrudnić? smiley Tylko czy to ma sens?

komentarz 3 stycznia 2017 przez wanttobeanengineer Obywatel (1,120 p.)
Musi być prywatna, ale nie ja to wymyśliłem tylko wykładowca.
0 głosów
odpowiedź 9 stycznia 2017 przez wanttobeanengineer Obywatel (1,120 p.)
edycja 10 stycznia 2017 przez wanttobeanengineer

Okej, o ile metody jakoś zrobiłem, to problemem jest dla mnie jak zrobić, żeby użycie operatora indeksowania sortowało tablicę w klasie B. 
Czyli, mam klasę A dla której robię przeładowanie operatora []. 
Ma również klasę B, która dziedziczy z klasy A.
Obie te klasy przechowują tablicę liczb typu double, ale w klasie B tablica ta zawsze ma być posortowana.
Czyli mając np. następujące liczby w obiekcie klasy B:
[0 1 4 7 8]
i zapisując:
 

main()
{
  double tab[] = {0,1,4,7,8};
  B objB(tab);
  B[2] = 9;
}

Powinno najpierw na miejscu 4 wstawić 9 -> [0,1,9,7,8]
a następnie posortować: [0,1,7,8,9]
Oczywiście metoda sortująca sort() jest prywatną metodą klasy B
Jakieś podpowiedzi?

Podobne pytania

0 głosów
5 odpowiedzi 1,916 wizyt
0 głosów
1 odpowiedź 673 wizyt
0 głosów
1 odpowiedź 223 wizyt
pytanie zadane 30 kwietnia 2021 w C# przez Adamek185wp Obywatel (1,280 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...