Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Korzystanie z argumentów klasy podstawowej w klasie pochodnej

Ostatnio zmodyfikowano 2016-09-09 20:30
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Korzystanie z argumentów klasy podstawowej w klasie pochodnej
» 2016-09-09 19:26:16
Witam. Przejdę do rzeczy. Piszę kod w celach treningu (dziedziczenie klas) i wygląda on tak:
C/C++
#include <iostream>
using namespace std;

class Punkt
{
protected:
    float x, y, r;
    string nazwa;
public:
    Punkt( string name = "punkcik", float iks = 0, float igrek = 0, float promien = 1 )
    {
        nazwa = name;
        x = iks;
        y = igrek;
        r = promien;
    }
    void wypisz();
   
};

class Oblicz
    : public Punkt
{
    float pi = 3.14;
    float pole;
public:
    void oblicz( Punkt obk )
    {
        pole = obk.r * obk.r * pi;
        cout << "punkt na osi jest na wspolrzednych x = " << obk.x << " i y = " << obk.y << "\npole = " << pole;
    }
};


void Punkt::wypisz()
{
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    cout << "r = " << r << endl;
    cout << "nazwa = " << nazwa << endl;
}
int main()
{
    Punkt naosi( "punkt", 3, 4, 6 );
    naosi.wypisz();
    Oblicz ay;
    ay.oblicz( naosi );
}

||=== Build: Debug in nauka (compiler: GNU GCC Compiler) ===|
C:\Users\Pawel\Desktop\nauka\main.cpp||In member function 'void Oblicz::oblicz(Punkt)':|
C:\Users\Pawel\Desktop\nauka\main.cpp|7|error: 'float Punkt::r' is protected|
C:\Users\Pawel\Desktop\nauka\main.cpp|28|error: within this context|
C:\Users\Pawel\Desktop\nauka\main.cpp|7|error: 'float Punkt::r' is protected|
C:\Users\Pawel\Desktop\nauka\main.cpp|28|error: within this context|
C:\Users\Pawel\Desktop\nauka\main.cpp|7|error: 'float Punkt::x' is protected|
C:\Users\Pawel\Desktop\nauka\main.cpp|29|error: within this context|
C:\Users\Pawel\Desktop\nauka\main.cpp|7|error: 'float Punkt::y' is protected|
C:\Users\Pawel\Desktop\nauka\main.cpp|29|error: within this context|
||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Wiem o co chodzi, że argumenty podstawowej są protected ale co z tego, skoro używane są w klasie pochodnej dziedziczonej :public ?
Powinny być dostępne w klasie pochodnej.
Help
P-151592
mateczek
» 2016-09-09 19:38:46
Połatałem tak jak mi się wydawało że być powinno
C/C++
#include <iostream>
using namespace std;

class Punkt
{
protected:
    float x, y, r;
    string nazwa;
public:
    Punkt( string name = "punkcik", float iks = 0, float igrek = 0, float promien = 1 )
    {
        nazwa = name;
        x = iks;
        y = igrek;
        r = promien;
    }
    void wypisz();
   
};

class Oblicz
    : public Punkt
{
    float pi = 3.14;
    float pole;
public:
    Oblicz( string name = "punkcik", float iks = 0, float igrek = 0, float promien = 1 )
        : Punkt( name, iks, igrek, promien )
    {
       
    }
    void oblicz()
    {
        pole = r * r * pi;
        cout << "punkt na osi jest na wspolrzednych x = " << x << " i y = " << y << "\npole = " << pole;
    }
};


void Punkt::wypisz()
{
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    cout << "r = " << r << endl;
    cout << "nazwa = " << nazwa << endl;
}
int main()
{
    Oblicz ay( "punkt", 3, 4, 6 );
    ay.oblicz();
}
P-151593
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-09-09 19:45:10
Jasne, to działa, tylko to metoda "na siłę". Mi chodzi bardziej o wykorzystanie argumentów z klasy podstawowej, żeby nie trzeba było ich znowu definiować. Chodzi mi o pobranie wartości argumentów obiektu klasy podstawowej, nie wiem jak to zrobić Punkt::argument albo obk.argument? Ktoś, coś?
edit. zauważyłem, że zmieniłeś, to już bliższe ale nadal nie to :/
P-151594
Monika90
» 2016-09-09 19:45:24
Klasa Oblicz ma dostęp do składowych x,y,z,r i nazwa, ale tylko w obiektach klasy Oblicz (lub klas pochodnych od Oblicz), takie są reguły języka. Gdyby tak nie było to protected nie rózniło by się niczym od public.

W sumie to i tak public niewiele się różni od protected, dlatego nie zaleca się używać danych protected, nawet sam Stroustrup niedawno przyznał, że dodanie tego do C++ było pomyłką.
P-151595
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-09-09 19:48:44
Moniko, czyli nie może się do nich "odwołać". O właśnie o to sformułowanie mi chodziło. Nie mogę np. zrobić metody w klasie Oblicz:
"wypisz argument x oraz y z obiektu obk klasy Punkt." ?
P-151596
mateczek
» 2016-09-09 19:53:24
jeszcze trochę poprawiłem kod wyżej !!!

Na tym polega dziedziczenie by jeden obiekt był jakimś rozwinięciem poprzedniego. Dlatego klasę pblicz nazwał bym smartPunkt By podkreślić że jest bardziej złożonym punktem z większą bazą możliwości

C/C++
#include <iostream>
using namespace std;

class Punkt
{
protected:
    float x, y, r;
    string nazwa;
public:
    Punkt( string name = "punkcik", float iks = 0, float igrek = 0, float promien = 1 )
    {
        nazwa = name;
        x = iks;
        y = igrek;
        r = promien;
    }
    void wypisz();
   
};

class smartPoint
    : public Punkt
{
    float pi = 3.14;
    float pole;
public:
    smartPoint( string name = "punkcik", float iks = 0, float igrek = 0, float promien = 1 )
        : Punkt( name, iks, igrek, promien ) //konstruktor klasy Punkt
    {
       
    }
    void oblicz()
    {
        pole = r * Punkt::r * pi; //r to obiekt z klasy punkt
        Punkt::wypisz(); //wypisz to funkcja z klasy punkt   
        cout << "Pole = " << pole << endl;
    }
};


void Punkt::wypisz()
{
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    cout << "r = " << r << endl;
    cout << "nazwa = " << nazwa << endl;
}
int main()
{
    smartPoint ay( "punkt", 3, 4, 6 );
    ay.oblicz();
}

To tak by zrozumieć ideę dziedziczenia. Dziedziczenie tworzy nową klasę która zawiera elementy klasy podstawowej, Dlatego nazwa "Oblicz jest niezbyt trafna do klasy dziedziczącej po Punkt i może wprowadzić w błąd !!!"
Pisząc public punkt rozszerzasz klasę punkt o nowe elementy zachowując wszystkie stare!!! 
P-151597
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-09-09 20:00:47
Ok, dzięki Mateczek. Na razie nie zamykam tematu, może Monika coś jeszcze doda :)
P-151598
Monika90
» 2016-09-09 20:08:49
Można się odwołać do swoich własnych składowych
C/C++
void oblicz()
{
    cout << "punkt na osi jest na wspolrzednych x = " << x << " i y = " << y;
}


Można się odwołać do składowych innego obiektu tej samej klasy
C/C++
void oblicz( Oblicz o )
{
    cout << "punkt na osi jest na wspolrzednych x = " << o.x << " i y = " << o.y;
}


Ale nie można się odwołać do składowych obiektu innej klasy
C/C++
void oblicz( Punkt p )
{
    cout << "punkt na osi jest na wspolrzednych x = " << p.x << " i y = " << p.y; //nie przejdzie :(
}

P-151599
« 1 » 2
  Strona 1 z 2 Następna strona