Odwoływanie się do metody w klasie

0
#include <iostream>
#include "przyjaciel.h"
using namespace std;
 
int main()
{
 
    Punkt pkt1("A",3,17);
    //pkt1.wczytaj();
 
    Prostokat p1("Prostokat",0,0,6,4);
    //p1.wczytaj();
    p1.wczytaj();
    p1.sedzia();
 
    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 class Prostokat;
 
 
};
 
class Prostokat
{
   string nazwa;
   float x,y,szerokosc,wysokosc;
 
public:
   Prostokat(string="brak",float=0,float=0,float=1,float=1);
   void sedzia();
   void wczytaj();
 
 friend class Punkt;
 
};
#include <iostream>
#include "przyjaciel.h"
using namespace std;
 
Punkt pkt1("A",3,17);
Prostokat p1("Prostokat",0,0,6,4);
 
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::sedzia()
{
    p1.nazwa="PODMIANA";
   if((pkt1.x>=p1.x)&&(pkt1.x<=p1.x+p1.szerokosc)&&(pkt1.y>=p1.y)&&(pkt1.y<=p1.y+p1.wysokosc))
 
cout<<endl<<"Punkt "<<pkt1.nazwa<<" nalezy do prostokata: "<<p1.nazwa;
 
else
 
cout<<endl<<"Punkt "<<pkt1.nazwa<<" lezy POZA prostokatem: "<<p1.nazwa;
 
}
 
 
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;*/
  cout<<endl<<"Nazwa obiektu: "<<nazwa;
}

Napisałem program który sprawdza czy punkt leży na prostokącie,funkcja która to sprawdza jest metodą klasy która leży poza main.cpp i utworzenie klasy w mainie nic nie da bo jej nie widzi tamta metoda ,jak to można poprawić żeby nie bylo konieczne tworzenie dwa razy tych samych obiektów? chyba że program może zostać tak jak teraz

2

Dlaczego masz globalne obiekty p1 i pkt1? Co tam w ogóle chcesz osiągnąć? Strasznie zawiły ten kod.

2

friend class Punkt;

Aż oczy pieką. Jeśli decydujesz się na coś takiego to znaczy, że nie przemyślałeś architektury klas, bo friend łamie podstawową zasadę obiektówki: enkapsulację. Skoro coś ma być prywatne to tak ma być, a nie, że później jakaś klasa ma do tego dostęp. Kompletnie nielogiczne założenie.

2

Mirosława Zelenta który zrobił to zadanie ale wykorzystując funkcję zamiast metody -

To już lepiej książkę sobie jakąś kup. W ogóle widzę jak dużo miesza ten człowiek swoim słuchaczom w głowach. Co rusz pojawia się tutaj człowiek, który naoglądał się C++ Zelenta i powiela jego błędy w swoich programach. Zelent może i prowadzi te kursy przystępnie ale informacje jakie przekazuje są nieprawidłowe i mieszają ludziom w umysłach. Takie rzeczy jak stosowanie zmiennych globalnych czy deklaracji przyjaźni, kiedy coś mu nie pyknie, o copy-paste nie wspominając. Już Grębosz w swoich książkach, nawet lata temu w pierwszych rozdziałach, pisze wyraźnie, żeby nie korzystać ze zmiennych globalnych jeśli naprawdę nie ma takiej potrzeby. W Twoim kodzie nie ma na pewno.

Tak w ogóle to powinna być tutaj agregacja czy kompozycja w stylu: klasa prostokąt posiada wektor/tablicę obiektów klasy punkt. Wtedy jakoś to się będzie spinać. Jeśli naprawdę wszystkie pola klasy muszą być dostępne publicznie to zamiast friend zrób z takiej klasy strukturę. Osiągniesz to samo bez jakiejś czarnej magii. Już w ogóle wzajemna przyjaźń Twoich klas w kodzie to naprawdę masakra.

Takie rzeczy jak string przekazuj przez referencję np. const string& phrase, bo tak to niepotrzebnie tworzysz kopię obiektu, który przekazujesz jako argument funkcji. Poczytaj co to jest przekazywanie argumentu przez wartość vs przekazywanie przez wskaźnik czy referencje. Zacznij od początku, a nie od jakiegoś kursu z netu, który tylko miesza ludziom w głowach.

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