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: #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 |
|
mateczek |
» 2016-09-09 19:38:46 Połatałem tak jak mi się wydawało że być powinno #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(); } |
|
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 :/
|
|
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ą. |
|
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." ? |
|
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 #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 ) { } void oblicz() { pole = r * Punkt::r * pi; Punkt::wypisz(); 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!!! |
|
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 :) |
|
Monika90 |
» 2016-09-09 20:08:49 Można się odwołać do swoich własnych składowych 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 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 void oblicz( Punkt p ) { cout << "punkt na osi jest na wspolrzednych x = " << p.x << " i y = " << p.y; }
|
|
« 1 » 2 |