Deklaracje przyjazni - wypisywanie

0

Wg te regułki:

Jeżeli klasa M deklaruje przyjazn z klasa K to oznacza, ze wszystkie funkcje składowe klasy K maja dostep do prywatnych lub chronionych skladnikow klasy M.

Tak więc mam kod:

 #include <iostream>
using namespace std;
class figury;
class dane
{
    int bokA,bokB, pole;
    friend class figury;
};

class figury
{
  public:
  void obliczPoleKwadratu(int A)
  {
      dane kwadrat;
      kwadrat.bokA = A;
      kwadrat.pole = A*A;
      cout << "Pole kwadratu dla podanych przez Ciebie parametrow to: " << kwadrat.pole << endl;

  }

  void obliczPoleProstokata(int A,int B)
  {
      dane prostokat;
      prostokat.bokA = A;
      prostokat.bokB = B;
      prostokat.pole = A*B;
      cout << "Pole prostokata dla podanych przez Ciebie parametrow to: " << prostokat.pole << endl;



  }

 };

int main()
{
figury poleKwadratu, poleProstokata;
int co;
cout << "[1] Pole Kwadratu, [2] Pole Prostokata" << endl;
cout << "Podaj co chcesz wyliczyc: ";
cin >> co;

switch(co)
{
    case 1:
    int bokA;
    cout << "Podaj bok kwadratu: ";
    cin >> bokA;
    poleKwadratu.obliczPoleKwadratu(bokA);
    break;

    case 2:
    int bokJeden, bokDwa;
    cout << "Podaj krotszy bok prostokata: ";
    cin >> bokJeden;
    cout << "Podaj dluzszy bok prostokata: ";
    cin >> bokDwa;
    poleProstokata.obliczPoleProstokata(bokJeden,bokDwa);
    break;

    default:
    cout << "Zla wartosc!" << endl;
}

}

i chcę teraz aby metoda: wypisz() odpowiadała za wypisywanie danych na ekran. Niestety za chiny nie wiem jak ją zaimplementować. Próbowałem już chyba wszystkiego.... nie wiem jak napisać tę metodę aby wypisywała na ekran kwadrat.pole oraz prostokat.pole...

(tutaj jej nie napisałem bo mi nie działała)..

0

Jak chcesz wypisać wartości pól obiektów kwadrat i prostokat skoro są zadeklarowane lokalnie w metodach obliczPole...?

0

Czyli mam je zadeklarować...w klasie dane? Czy jak?

0

Twoja wola jak to zrobisz, byle byś miał dostęp do tych obiektów. Zapewne chcesz wywołać funkcję/metodę wypisz(), po obliczeniu obydwu pól figur, tak? To skoro chcesz tak zrobić te obiekty muszą istnieć jeszcze, a w tym momencie po zakończeniu metod obliczPole... obiekt przestaje istnieć. Możesz dać te obiekty do klasy figury i na nich robić operacje, a potem wywołać wypisz() w celu dostępu do tamtych obiektów.

0

Nie rozumiem.... ?:P Przecież są w klasie figury. Mam tam wywołać funkcje wypisz? A to oznacza, ze musze jej zrobic deklaracje wstepna.

0

No to co, że są w klasie figury, ale wraz z zakończeniem tych metod przestają istnieć. Nie wiem gdzie chcesz wywołać tą metodę/funkcję wypisz.

0

no to pytam Cię jak to zrobić....;) mam w funkcji wywolać funkcje?

0
Dr Zielu napisał(a)

no to pytam Cię jak to zrobić....;) mam w funkcji wywolać funkcje?

wiesz co to zasięg zmiennych? Może zacznij od tego, a nie od razu do obiektowego programowania się zabierasz :]

0

Zielu wytłumacz mi dokładnie co chcesz zrobić to ci poprawię kod żeby działało, ale dalej nie wiem co dokładnie chcesz zrobić.

0

Jak widać mam metody, które obliczają pole kwadratu i prostokąta.
Ok.
W nich mogę wpisać np:

 cout << "pole to: " << prostokat.pole << endl; 

i wyświetli mi to pole kiedy w funkcji main wywołam to tak:

poleProstokata.obliczPoleProstoka(bokA);

a ja chcę stworzyć metodę wypisz(), która zajmie tym wypisywaniem wyników z obliczPoleProstoka

Tylko, że mi ta metoda nie działa...jak bym jej nie napisał.... :(
Rozumiesz?
Jedna metoda liczy pole, druga wypisuje i zależy mi, żeby była deklaracja przyjaźni...

0

O to ci chodzi? Bo dalej cię nie rozumiem...

class figury
{
private:
    dane kwadrat;
    dane prostokat;

public:
    void obliczPoleKwadratu(int A)
    {
        kwadrat.bokA = A;
        kwadrat.pole = A*A;
        cout << "Pole kwadratu dla podanych przez Ciebie parametrow to: " << kwadrat.pole << endl;
    }

    void obliczPoleProstokata(int A,int B)
    {
        prostokat.bokA = A;
        prostokat.bokB = B;
        prostokat.pole = A*B;
        cout << "Pole prostokata dla podanych przez Ciebie parametrow to: " << prostokat.pole << endl;
    }

    void wypisz()
    {
        cout << prostokat.pole << endl;
        cout << kwadrat.pole << endl;
    }

};
0

Tak. Ale chciałbym, żeby były dwie metody wypisz i każda z nich wypisywała:

wypiszPoleKwadratu - wypisuje pole kwadratu
wypiszPoleProstokata - wypisuje pole prostokata...

Natomiast w metodzie liczącej to pole nie ma być

cout << "Pole to:...";
0

Tak?

class figury
{
  private:
      dane kwadrat;
      dane prostokat;
  public:
      void obliczPoleKwadratu(int A)
      {
          kwadrat.bokA = A;
          kwadrat.pole = A*A;
      }
 
      void obliczPoleProstokata(int A,int B)
      {
          prostokat.bokA = A;
          prostokat.bokB = B;
          prostokat.pole = A*B;
      }

      void wypiszPoleProstokata()
      {
          cout << prostokat.pole << endl;
      }

      void wypiszPoleKwadratu()
      {
          cout << kwadrat.pole << endl;
      }
 };
0

Jaśniej:
Osobno ma być metoda licząca pole a osobno ma być metoda wypisująca je na ekranie... :D

0

TAK WŁĄSNIE!
Robiłem niemal identycznie tylko, że w klasie figury nie dałem:

  private:
      dane kwadrat;
      dane prostokat; 

czy to przez to, iż private nie dalem?

0

Private napisałem tylko dla ścisłości, domyślnie pola są prywatne, więc nie dałeś zapewne deklaracji tych pól. Radzę ci zaopatrzyć się w jakąś książkę nt. podstaw języka i programowania obiektowego.

0

Dobra przyznaje sie...jestem debilem.
Jak głupi i z uporem maniaka nie zauważyłem (mój częsty błąd ostatnio), że tworzę obiekty w metodach... a to logiczne, ze wtedy są z zakresem tej metody... OMG!

0

@Xeo:
Mam symfonie :P

0

I nie jest tam napisane, że te relacje Friend nie są zbyt "ciekawe"? bo w TiC++ jest..

0

dawno czytalem ten rozdzial i raczej nie pamietam zeby tak bylo napisane. A thinking in c++ mam i wydaje sie mniej ciekawe...( po ang mam )

0

polską wersję też czytalem( w sklepie) ;P poza tym wielu uwqza ze symfonia jest o niebo lepsza

0
dr zielu napisał(a)

polską wersję też czytalem( w sklepie) ;P poza tym wielu uwqza ze symfonia jest o niebo lepsza

wielu uważa, że symfonia jest daremna. Po co się sugerujesz innymi? Przeczytaj oceń i napisz co sam o tym myślisz. W temacie o umiejętnościach w pierwszej pracy (OT) też sugerujesz się zdaniem innych. Wyrób sobie własną opinie na dany temat bo kiedyś ktoś ci bajkę sprzeda i w to uwierzysz. Poza tym chętnie poznałbym argumenty, które przeważają za tą "o niebo lepszością" :]

0

-Pisana jest łatwiejszym do zrozumienia językiem,
-Jest o wiele więcej zadań a końcu rozdziałów, które dają do myślenia,
-Autor nie zakłada, "że ty to już wiesz" tylko wałkuje temat do końca.

Takie są moje argumenty a co ty możesz powiedzieć na temat Thinking in c++?:)

0

-lepiej opisuje bibliotekę standardową
-autor nie pisze do 14 letnich dzieci
-stosunek liczby stron do ilości przekazanych informacji
(niestety minusem symfonii jest fakt, że tak gruba książka nie wyczerpuje za bardzo tematu czego oczekiwałby nie jeden czytelnik kupując ją)
poza tym na forum częściej spotykam ludzi mających problemy z zadaniami, czy przykładowymi kodami z symfonii niż z thinking in c++ - chociaż tutaj można by polemizować bo wynikać to może z popularności jednej z nich :)
-(forma) wypowiedzi autora, nie zawsze przypadła mi do gustu. Po prostu lepiej mi się czytało thinking.

w thinking drażnią mnie listingi, nie zawsze są one czytelne. Czy argumenty, które podałeś wyżej rzeczywiście powodują, że symfonia jest "o niebo lepsza" ? Nie. Tak samo jak moje nic nie wnoszą. Ważne jest to, że w tej chwili wymieniamy się swoimi poglądami. Ani ty ani ja nie reprezentujemy zdania "innych". To są nasze opinie.

Nie uważam, że symfonia jest złą książką ani, że thinking in c++ jest najlepszą. Obie pozycje cenie jak i wiele innych. Oceny te są subiektywne.

0

Co do zadań to zgodzę się z tobą :)
Denerwujące jest w symfonii to, że autor wiele zadań daje z zakresu fizyki....albo takie, których zagadnień nie wyjaśnił w rozdziale. Może zakupie I tom :) Warto spróbować :)

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