Problem z dziedziczeniem wartości klasy bazowej do klasy pochodnej

0

Hej,
otóż napisałam pewien program, a jeśli chodzi o dziedziczenie to jest moje totalne raczkowanie.
Program ma za zadanie stworzyć 4-blokową choinkę.
Pierwsza klasa= pierwszy blok, druga klasa=drugi blok itp.
Chciałabym odziedziczyć po pierwszej klasie wartość jaką jest wysokość pierwszego bloku. Niestety podsyłam ją przez konstruktor, który pobiera te wartośc przez funkcję pytającą o wysokość pierwszego bloku. Ta wartość będzie mi potrzebna do drugiej klasy, jak i trzeciej dziedziczącej po drugiej itd.

.H:

#include <iostream>

using namespace std;

class Pierwsza{
protected:
    int wysokosc;
public:
    void wczytaj();
    Pierwsza(int=1);
    int rysuj();

};

class Druga :public Pierwsza{

public:
    //void rysuj2();
    //Druga(int=1);

};

.CPP:

#include <iostream>
#include "choinka.h"

using namespace std;

void Pierwsza::wczytaj()
{
    cout <<"Podaj wysokosc pierwszej czesci choinki: ";
    cin >>wysokosc;
    cout << endl;
}

Pierwsza::Pierwsza(int wys)
{
    wysokosc=wys;
}


int Pierwsza::rysuj()
{
    int n=1;
    int j=1;
    int i=0;
    while(wysokosc>0)
    {
        i=0;
        while(i<wysokosc-1)
        {
            cout << " ";
            i++;

        }
            while(j<=(n*2)-1)
            {
                cout << "*";
                j++;
            }
            j=1;
            cout << endl;


        wysokosc--;
        n++;
    }
    return n;

}

/*Druga::Druga (int wys)
            :Pierwsza(wysokosc)
{
    wysokosc=wys;
}

void Druga::rysuj2()
{
    cout << wysokosc << endl;
}*/
2

Jak brzmi pytanie? Jaki jest błąd, co nie działa?

0

Przyjrzyj się poniższemu schematowi dziedziczenia, które możesz wykorzystać w swoim zadaniu:
Zwróć uwagę na :

  1. Metoda draw jest wirtualna - każda klasa w ma swoją własną implementację.
  2. Używany jest lista inicjalizacyjna, w której wywoływany jest konstruktor z klasy nadrzędnej.
  3. Konstruktor klasy Second przyjmuje dwie wartości, dla ustawienia swojej wysokości jak i dla wysokości klasy dziedziczącej First
  4. W metodzie draw dla klasy Second wywoływana jest metoda draw z klasy First poprzez First::draw().
#include <iostream>

using namespace std;

class First
{
protected:

    int height1;

public:

    First( int height1_ = 1 ) : height1 {height1_} {};

    virtual void draw()
    {
        cout << "First class height is " << height1 << endl;
    }

};

class Second : public First
{
protected:

    int height2;

public:

    Second( int height1_ = 1 , int height2_ = 1 ) : First {height1_} , height2 {height2_} {};

    void draw() override
    {
        First::draw();
        cout << "Second class height is " << height2 << endl;
    }

};

int main()
{
    Second second {10,20};
    second.draw();

    return 0;
}
2

Jak już zrobisz to ćwiczenie i zaliczysz, to szybko zapomnij.
Dziedziczenie w takim projekcie jest chore w normalnej sytuacji (czasem wykładowcom brakuje fantazji, by wymyślić zadanie, i wymyślają herezje)

0
AnyKtokolwiek napisał(a):

Jak już zrobisz to ćwiczenie i zaliczysz, to szybko zapomnij.
Dziedziczenie w takim projekcie jest chore w normalnej sytuacji (czasem wykładowcom brakuje fantazji, by wymyślić zadanie, i wymyślają herezje)

No właśnie tez to czuje, nie widzę tutaj szczególnie sensu używać tu dziedziczenia no ale cóż...

0
Spine napisał(a):

Jak brzmi pytanie? Jaki jest błąd, co nie działa?

Problem brzmi „chciałabym pobrać nową wartosc „wysokość” do klasy pochodne ale nie wiem jak”

0
TomaszLiMoon napisał(a):

Przyjrzyj się poniższemu schematowi dziedziczenia, które możesz wykorzystać w swoim zadaniu:
Zwróć uwagę na :

  1. Metoda draw jest wirtualna - każda klasa w ma swoją własną implementację.
  2. Używany jest lista inicjalizacyjna, w której wywoływany jest konstruktor z klasy nadrzędnej.
  3. Konstruktor klasy Second przyjmuje dwie wartości, dla ustawienia swojej wysokości jak i dla wysokości klasy dziedziczącej First
  4. W metodzie draw dla klasy Second wywoływana jest metoda draw z klasy First poprzez First::draw().
#include <iostream>

using namespace std;

class First
{
protected:

    int height1;

public:

    First( int height1_ = 1 ) : height1 {height1_} {};

    virtual void draw()
    {
        cout << "First class height is " << height1 << endl;
    }

};

class Second : public First
{
protected:

    int height2;

public:

    Second( int height1_ = 1 , int height2_ = 1 ) : First {height1_} , height2 {height2_} {};

    void draw() override
    {
        First::draw();
        cout << "Second class height is " << height2 << endl;
    }

};

int main()
{
    Second second {10,20};
    second.draw();

    return 0;
}

Chyba nie do końca o coś takiego mi chodziło. Przełożyłam Twój pomysł na moje zadanie i mimo listy inicjalizacyjnej, do atrybutu klasy pochodnej nie chce się przesłać ta zmieniona przez użykownika za pomocą funkcji wczytaj() wartość.

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