• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odcinek 4 obiektowy c++. Błędy związane z brakiem deklaracji. Funkcja jako metoda w klasie prostokąt

Object Storage Arubacloud
–1 głos
820 wizyt
pytanie zadane 22 września 2016 w C i C++ przez nauwalis Mądrala (7,350 p.)
edycja 23 września 2016 przez nauwalis

Mianowicie mam problem z kodem. Komunikat otrzymuje o braku deklaracji, nie mam pojęcia dlaczego. Czy ktoś mógłby pomóc?

#include <iostream>
#include "przyjaciele.h"
using namespace std;

/* void sedzia(Punkt pkt, Prostokat p)
{
   if((pkt.x >= p.x)&&(pkt.x <= p.x + p.szerokosc)&&(pkt.y >= p.y)&&(pkt.y <= p.y + p.wysokosc))
        cout << endl << "Punkt " << pkt.nazwa << " nalezy do prostokata: " << p.nazwa;
   else
        cout << endl << "Punkt " << pkt.nazwa << " lezy poza prostokatem: " << p.nazwa;
} */

int main()
{
    Punkt pkt1("A", 3, 17);
    Prostokat p1("Prostokat", 0, 0, 6, 4);
    sedzia(pkt1, p1);
    return 0;
}
#include <iostream>

using namespace std;

class Prostokat;

class Punkt
{
    string nazwa;
    float x, y;
public:
    Punkt(string = "A", float = 0, float = 0);
    void wczytaj();
    // friend void sedzia(Punkt pkt, Prostokat p);
    friend class Prostokat;
};

class Prostokat
{
    string nazwa;
    float x, y, szerokosc, wysokosc;
public:
    Prostokat(string = "brak", float = 0, float = 0, float = 1, float = 1);
    void wczytaj();
    void sedzia();
    friend class Punkt;

};
#include <iostream>
#include "przyjaciele.h"
using namespace std;

Punkt::Punkt(string n, float xx, float yy)
{
    nazwa = n;
    x = xx;
    y = yy;
}

void Punkt::wczytaj()
{
    cout << "Podaj x: "; cin >> x;
    cout << "Podaj y: "; cin >> y;
    cout << "Nazwa punktu: "; cin >> nazwa;
}

Prostokat::Prostokat(string n, float xx, float yy, float s, float w)
{
    nazwa = n;
    x = xx;
    y = yy;
    szerokosc = s;
    wysokosc = w;
}

void Prostokat::wczytaj()
{
    cout << "Podaj x lewego dolnego naroznika: "; cin >> x;
    cout << "Podaj y lewego dolnego naroznika: "; cin >> y;
    cout << "Podaj szerokosc: "; cin >> szerokosc;
    cout << "Podaj wysokosc: "; cin >> wysokosc;
    cout << "Podaj nazwe prostokata: "; cin >> nazwa;
}

void Prostokat::sedzia(Punkt pp, Prostokat prro)
{
       if((pkt.x >= p.x)&&(pkt.x <= p.x + p.szerokosc)&&(pkt.y >= p.y)&&(pkt.y <= p.y + p.wysokosc))
        cout << endl << "Punkt " << pkt.nazwa << " nalezy do prostokata: " << p.nazwa;
   else
        cout << endl << "Punkt " << pkt.nazwa << " lezy poza prostokatem: " << p.nazwa;
}

 

komentarz 22 września 2016 przez efiku Szeryf (75,160 p.)
Poczytać kurs C++ na temat funkcji.
komentarz 22 września 2016 przez nauwalis Mądrala (7,350 p.)
Chcę to zmienić, żeby ta funkcja była metodą klasy prostokąt, a nie funkcją z maina. Stąd mam problem i oczekuje nakierowania a nie rzucenia hasłem.
komentarz 22 września 2016 przez efiku Szeryf (75,160 p.)

Chcę to zmienić, żeby ta funkcja była metodą klasy prostokąt, a nie funkcją z maina. Stąd mam problem i oczekuje nakierowania a nie rzucenia hasłem.

Dopiero teraz o tym piszesz. W pytaniu jest tylko, że nie działa. 

To zrób tą metode w klasie prostokąt, gdzie argumentem będzie zmienna typu Prostokat.  Wtedy pobierasz w metodzie dane z klasy oraz z argumentu i dokonujesz obliczen.

Ba, nawet widzę, że coś jest, ale obie funkcje się nie pokrywają w klasie, jedna nie ma wgl parametrów, a druga ma. Strasznie to namieszane :P 

komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)

Tak, nie pokrywaja bo kolega zle spisal kod z odcinka.... Prosze popatrz na 21:50.... Tam widac deklaracje funkcji przyjazni....

 

W klasie dajesz
 

friend void sedzia(Punkt ptk, Prostokat p);



A ty probujesz zadeklarowac klase jako przyjaciela, a nie funkcje jako przyjaciela obu klas.

komentarz 22 września 2016 przez efiku Szeryf (75,160 p.)

A ja jestem zdania, że jak jest friend to znak, że nie umiemy do końca obiektówki.

Tutaj wg mnie lepsze rozwiązanie. 
this. oznacza składowe w klasie Prostokąt. 

void Prostokat::sprawdzPunkt(Punkt  &punkt)
{
       if((punkt.x >= this.x)&&(punkt.x <= this.x + this.szerokosc)&&(punkt.y >= this.y)&&(punkt.y <= this.y + this.wysokosc))
        cout << endl << "Punkt " << punkt.nazwa << " nalezy do prostokata: " << p.nazwa;
   else
        cout << endl << "Punkt " << punkt.nazwa << " lezy poza prostokatem: " << p.nazwa;
}

 

komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
@efik ja juz nie wiem w ilu ty jezykach siedzisz :D nie do konca sie moge zgodzic, bo funkcja friend jest jednak malym udogdnieniem, np. gdy piszesz walke z mobami
komentarz 23 września 2016 przez nauwalis Mądrala (7,350 p.)

Dziękuje za odpowiedzi. Mam jednak problem ciągle z tym, że dostaję komunikat w mainie, że class:punkt has no member named sprawdzPunkt

#include <iostream>
#include "przyjaciele.h"
using namespace std;

void sedzia(Punkt &pkt,Prostokat &p)
{
   p.nazwa="PODMIANA";

if((pkt.x>=p.x)&&(pkt.x<=p.x+p.szerokosc)&&(pkt.y>=p.y)&&(pkt.y<=p.y+p.wysokosc))

cout<<endl<<"Punkt "<<pkt.nazwa<<" nalezy do prostokata: "<<p.nazwa;

else

cout<<endl<<"Punkt "<<pkt.nazwa<<" lezy POZA prostokatem: "<<p.nazwa;


}

int main()
{
    Punkt pkt1("A",3,17);
    //pkt1.wczytaj();

    Prostokat p1("Prostokat",0,0,6,4);
    //p1.wczytaj();

    sedzia(pkt1,p1);
    pkt1.sprawdzPunkt();
    p1.wczytaj();

    return 0;
}

 

komentarz 23 września 2016 przez efiku Szeryf (75,160 p.)
No jak kopiujesz mój kod bez znajomości OOP w C++ to aż dziw, że nie działa.

Naprawdę pomoże poczytanie o klasach w C++ metodach ich składowych..
komentarz 23 września 2016 przez Boshi VIP (100,240 p.)
Nie jestem ekspertem w c++, ale na moje friend to obejście prawidłowej architektury systemu obiektowego. Nie da się podpiąć pod prywatne metody? jak to nie da, dajmy friend!

1 odpowiedź

+1 głos
odpowiedź 23 września 2016 przez niezalogowany
wybrane 23 września 2016 przez nauwalis
 
Najlepsza

1. W mainie źle wywołujesz funkcję. Skoro sprawdzPunkt jest w klasie prostokąt to wywołujemy go na obiekcie klasy prostokąt i podsyłamy obiekt punkt:

p1.sprawdzPunkt(pkt1);

2. W pliku przyjaciele.h w klasie prostokąt brakuje w funkcji sprawdzPunkt jest za to jakaś funkcja "void sedzia()" zamień ją na:

void sprawdzPunkt(Punkt  &punkt);

3. W pliku przyjaciele.cpp usuń funkcję sprawdz i wklej tą:

void Prostokat::sprawdzPunkt(Punkt  &punkt)
{
       if((punkt.x >= x)&&(punkt.x <= x + szerokosc)&&(punkt.y >= y)&&(punkt.y <= y + wysokosc))
        cout << endl << "Punkt " << punkt.nazwa << " nalezy do prostokata: " << nazwa;
   else
        cout << endl << "Punkt " << punkt.nazwa << " lezy poza prostokatem: " << nazwa;
}
komentarz 23 września 2016 przez nauwalis Mądrala (7,350 p.)
Dziękuję za odpowiedź z wytłumaczeniem. Teraz wiem, że źle uzywałam wywoływania funkcji.
1
komentarz 23 września 2016 przez niezalogowany
Oj wiem jak to jest jak zaczyna się obiektówkę - potrzeba dużo czasu by wszystko zrozumieć :)
Pozdrawiam

Podobne pytania

0 głosów
1 odpowiedź 1,213 wizyt
pytanie zadane 31 sierpnia 2018 w C i C++ przez profesorek96 Szeryf (91,420 p.)
0 głosów
3 odpowiedzi 1,039 wizyt
pytanie zadane 29 września 2017 w Python przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 82 wizyt

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...