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, botów: 0