Pole figury

0

Witam mam problem z programem mającym obliczyć pole prostokąta. Dostałem dokument w którym są wytyczne co do wykonania programu oto jego treść:

o	Implementującego klasę Figura
	Pola 
•	string nazwa, 
•	int ilek – ile krawędzi
	Metoda
•	Ilekrawedzi -  zwracająca ilość krawędzi figury
•	dane – wyświetlająca nazwę figury i ilość krawędzi wykorzystując w/w metodę 
o	Implementującego klasę Prostokat
	Dziedzicząca po klasie Figura
	Pola
•	float wys, szer – wysokość i szerokość figury
	Metody
•	Konstruktor parametryczny uzupełniający pola: nazwa, ilek, wys, szer
•	pole – zwracająca pole figury
o	Tworzącego obiekt klasy Prostokąt przy użyciu w/w konstruktora
o	Wywołaniu metod pole i dane
o	UWAGA – pola nie mogą być o dostępie public.

A oto mój kod pomóżcie znaleźć problem bo nie mogę załapać co jest nie tak próbowałem już na kilka sposobów. Z góry wielkie dzięki za pomoc :-)

#include <iostream>
#include <cstdlib>
using namespace std;

class Figura
{
protected:
string nazwa;
int ilek;


void Ilekrawedzi()
{
    cout<<"Ilosc krawedzi: "<<ilek<<endl;       
}

void dane()
{
     cout<<"Nazwa figur: "<<nazwa<<endl;
     this->Ilekrawedzi();
     }
      };

class Prostokat: protected Figura
{
private:
float wys,szer;

public:
Prostokat(string n, int ik, float w, float s)
{
 this->nazwa=n;
 this->ilek=ik;
 this->wys=w;
 this->szer=s;             
                 }
                 
void pole ()
{
cout<<"Pole: "<<wys*szer<<endl;
}
      };

int main ()
{
Prostokat p1("Prostokat",4,15,10);
p1.dane();
p1.pole();
    system ("pause");
    return 0;
}
0

Ilekrawedzi - zwracająca ilość krawędzi figury
• dane – wyświetlająca nazwę figury i ilość krawędzi wykorzystując w/w metodę

int ileKrawedzi(){
return ilek;
}

void dane(){
cout<<"Nazwa figury : "<<nazwa<<"ilosc krawedzi: "<<ileKrawedzi()<<endl;
}

0

Ok zgadzam się zwraca a wyświetla to zasadnicza różnic dzięki że to zauważyłeś ale nadal mam jakiś problem ze specyfikatorem dostępu a wiem że specyfikator protected zastał stworzony właśnie na potrzeby dziedziczenia. więc co jest nie tak?

#include <iostream>
#include <cstdlib>
using namespace std;

class Figura
{
protected:
string nazwa;
int ilek;


int ileKrawedzi()
{
    return ilek;
}

void dane()
{
     cout<<"Nazwa figury : "<<nazwa<<endl;
     cout<<"ilosc krawedzi: "<<ileKrawedzi()<<endl;
} 
      };

class Prostokat: protected Figura
{
private:
float wys,szer;

public:
Prostokat(string n, int ik, float w, float s)
{
 this->nazwa=n;
 this->ilek=ik;
 this->wys=w;
 this->szer=s;             
                 }
                 
void pole ()
{
cout<<"Pole: "<<wys*szer<<endl;
}
      };

int main ()
{
Prostokat p1("Prostokat",4,15,10);
p1.dane();
p1.pole();
    system ("pause");
    return 0;
}
0

próbowałem też przyjaźni między klasami ale nadal kompilator pokazuje problem w tym samym miejscu pomocy :(

0

Prostokat p1("Prostokat",4,15,10); <----A
p1.dane(); <----B
p1.pole(); <----C

class Prostokat: protected Figura <-----D
{....
public:
...
void pole () <------E
{....
}
}

class Figura
{
protected:
....
void dane() <------F
{
....
...
}

w miejscu A tworzysz prostokat, z niego w miejscu C probujesz wywolac POLE. Pole zostalo w miejscu E zadeklarowane jako publiczne -- wiec jest ok.

w miescu B probujesz wywolac DANE. Dane zostalo w miejscu F zadeklarowane jako protected klasy Figura. Klasa prostokat w miejscu D dziedziczy po klasie Figura, otrzymuje wiec całą zawartość klasy Figura. Otrzymuje więc również metodę DANE -- oznaczoną jako protected w miejscu F. Dane jest protected, więc w miejscu B nie masz prawa go wywołać - main nie ma nic wspolnego z drzewem klas figura/prostokat, wiec nie ma ono dostepu do składowych protected tych klas.

Twój strzał z dziedziczeniem-protected w miejscu E nie ma kompletnie związku i nic nie wnosi do kodu, poniewaz i tak cala zawartosc klady figura już była wcześniej oznaczona jako protected.

Jeżeli nie wiesz jak działają public:/protected:/private: na składnikach klasy - zajrzyj do jakiegos tutoriala na sieci.. jest to wyjasnione w wielu miejscach, nie tylko dla C++, ale i dla Javy, C#, ... - prawie wszedzie oznaczają to samo i zachowują się tak samo.

Jeżeli nie wiesz jak działają dziedziczenie-public/protected/private, przeczytaj tutaj: http://4programmers.net/Forum/viewtopic.php?id=162088

0

Ok już sobie poradziłem z tym. Dzięki za pomoc

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