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

klasy dziedziczenie wskazniki

0 głosów
92 wizyt
pytanie zadane 25 kwietnia 2020 w C i C++ przez demon1234 Nowicjusz (160 p.)
mam problem z napisaniem klasy add ;(

treśc zadania,

Napisz klasę Notebook reprezentującą zeszyt o zadanej nazwie. Zaimplementuj:

• Konstruktor przyjmujący nazwę zeszytu.

• Jedną metodę add, która przyjmuje wskaźnik na dowolny zeszyt i dodaje go jako dziecko zeszytu, na rzecz którego jest wołana.

• Jedną metodę print, która drukuje na standardowe wyjście nazwę zeszytu oraz wszystkich jego dzieci jak w przykładzie poniżej. Dzieci drukowane są w kolejności ich dodawania metodą add.

• Destruktor usuwający z pamięci wszystkie dzieci zeszytu.

Z klasy Notebook wyprowadź klasy PagesLine oraz PagesFloe reprezentujące odpowiednie rodzaje kartek . W każdej z nich zaimplementuj jedynie konstruktor przyjmujący nazwę. Wszystkie klasy powinny być przystosowane do użycia w przykładowym programie poniżej. Klasy korzystają tylko z plików nagłówkowych iostream, string, list.

int main()
{
PagesLine *lineYes = new PagesLine("lineYes");
PagesLine *lienNo = new PagesLine("lineNo");
Notebook *zeszyt = new Notebook("zeszyt");
zeszyt->add(yes);
zeszyt->add(no);
PagesFloe *floeYes = new PagesFloe("floeyes");
Notebook *zeszyt2 = new Notebook("zeszyt2");
zeszyt2->add(zeszyt);
zeszyt2->add(zeszyt2);
zeszyt2->print();
delete zeszyt;
}
komentarz 25 kwietnia 2020 przez tangarr VIP (140,460 p.)

Zacznij od napisania klasy Notebook o postaci:

class Notebook {
private:
  // tutaj daj zmienne
public:
    // zapamiętaj nazwę podaną w konstruktorze
    Notebook(const std::string &name);

    // usuń wszystkie dzieci w destruktorze
    ~Notebook();

    // dodaj dziecko
    void add(Notebook *child);

    // wypisz zawartość
    void print();
}

Kiedy to zaimplementujesz podziel się kodem

komentarz 25 kwietnia 2020 przez demon1234 Nowicjusz (160 p.)
#include <iostream>
#include <string>
#include <list>

using namespace std;

class Notebook{

public:
    list<Notebook*> obiekt;

    Notebook(const string &name ):name(name){};

    void add (Notebook *wskaznik ) {

        obiekt.push_back(wskaznik);

    };
    void print(){

            for (auto it=obiekt.begin(); it!=obiekt.end(); ++it)
            std::cout << " " << *it;

        }
   //~Notebook();

private:

    string name;


};

class PagesLine : public Notebook{

public:
    PagesLine(const string &name) :Notebook(name) {};


};

class PagesFloe : public Notebook{

public:
    PagesFloe(const string &name) :Notebook(name) {};

};


    int main()
{
    PagesLine *lineYes = new PagesLine("lineYes");
    PagesLine *lineNo = new PagesLine("lineNo");
    Notebook *zeszyt = new Notebook("zeszyt");
    zeszyt->add(lineYes);
    zeszyt->add(lineNo);
    PagesFloe *floeYes = new PagesFloe("floeYes");
    Notebook *zeszyt2 = new Notebook("zeszyt2");
    zeszyt2->add(zeszyt);
    zeszyt2->add(zeszyt2);
    zeszyt2->print();
    delete zeszyt;
}


na ten moment mam tyle.

komentarz 25 kwietnia 2020 przez tangarr VIP (140,460 p.)

1. metoda print: wyświetl nazwę obiektu a potem wywłoaj print dla wszystkich dzieci.

2. metoda add: tutaj przydałoby się zabezpieczenie przed tworzeniem cykli. W tej chwili linia

zeszyt2->add(zeszyt2);

powoduje straszne zamieszanie.

3. destruktor: wywołaj destruktor dla wszystkich dzieci

1 odpowiedź

+1 głos
odpowiedź 25 kwietnia 2020 przez poczatki Początkujący (360 p.)
edycja 25 kwietnia 2020 przez poczatki

Notebook *zeszyt = new Notebook("zeszyt");

Przede wszystkim trzeba zacząć od biblioteki (plik z końcówką .h)

#ifndef NOTEBOOK_H
#define NOTEBOOK_H

#include<iostream>

using namespace std;
class Notebook
{
string nazwa; 
public:
Notebook (string nazwa) //konstruktor
~Notebook() //destruktor
void add(Notebook *not);
void print();
};

#endif

To ci podpowiem na początek. Od tego musisz zrobić klasy, które dziedziczą z Notebook. Bo tak sugeruje ten fragment

Z klasy Notebook wyprowadź klasy PagesLine oraz PagesFloe

Tutaj masz przykłady LINK

I masz dwa wyjścia albo zrobić kolejny plik w projekcie z końcówką .cpp, gdzie rozpiszesz wszystkie funkcje i co mają robić albo możesz to zrobić w bibliotece.  Czyli po kolei 

• Konstruktor przyjmujący nazwę zeszytu.

Jeśli robisz to w drugim pliku ( .cpp), to musisz załączyć koniecznie bibliotekę!

#include"notebook.h" //*gdzie notebook to nazwa jaką nadasz plikowi .h"

Notebook::Notebook(string nazwa)
{
    this-> nazwa = nazwa;  //konstruktor przyjmujący nazwę zeszytu
}

itd. To nie są trudne rzeczy. Spróbuj dalej sam.

I koniecznie załącz też bibliotekę do maina! ( #include "notebook.h" *gdzie bib to nazwa jaką nadasz plikowi .h")

Podobne pytania

0 głosów
0 odpowiedzi 98 wizyt
pytanie zadane 18 kwietnia 2020 w C# przez Kamilmis Nowicjusz (120 p.)
0 głosów
1 odpowiedź 116 wizyt

89,087 zapytań

137,670 odpowiedzi

307,624 komentarzy

59,142 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...