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

Kurs obiektowy c++ odc 4 zadanie domowe

Object Storage Arubacloud
0 głosów
472 wizyt
pytanie zadane 12 marca 2019 w C i C++ przez Rokhar Nowicjusz (170 p.)

Witam mam problem. Nie wiem jak zrobić zadanie domowe jeśli rozdziele je na pliki punkt.h punkt.cpp prostokat.h prostokat.cpp nwm wgl jak wtedy zrobic funkcjie sedzia w pliku prostokat zeby widzial klase Punkt z innego pliku

main

#include <iostream>
#include "punkt.h"
#include "prostokat.h"


using namespace std;

int main()
{
    Punkt pkt;
    //pkt.wczytaj();
    Prostokat p;
  //  p.wczytaj();
    return 0;
}

punkt.h

#include <iostream>
using namespace std;
class Punkt
{
    public:
    string name;
    float x,y;
public:
    Punkt(string="A",float=0,float=0);
    void wczytaj();
};

punkt.cpp

#include <iostream>
#include "punkt.h"

using namespace std;

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

void Punkt::wczytaj()
{
    cout<<"Podaj nazwe punktu: ";cin>>name;
    cout<<"Podaj x: ";cin>>x;
    cout<<"Podaj y: ";cin>>y;

}

prostokat.h

#include <iostream>
using namespace std;
class Prostokat
{
string name;
float x,y,szerokosc,wysokosc;
public:
Prostokat(string="A",float=0,float=0,float=1,float=1);
void wczytaj();
};

prostokat.cpp

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

Prostokat::Prostokat(string n,float xx,float yy,float s,float w)
{
    name=n;
    x=xx;
    y=yy;
    szerokosc=s;
    wysokosc=w;
}
void Prostokat::wczytaj()
{
    cout<<"Podaj nazwe prostokata: ";cin>>name;
    cout<<"Podaj x: ";cin>>x;
    cout<<"Podaj y: ";cin>>y;
    cout<<"Podaj szerokosc: ";cin>>szerokosc;
    cout<<"Podaj wysokosc: ";cin>>wysokosc;
}

 

1 odpowiedź

+1 głos
odpowiedź 12 marca 2019 przez criss Mędrzec (172,590 p.)
wybrane 14 marca 2019 przez Rokhar
 
Najlepsza
Po prostu #include "punkt.h" w prostokat.h. Ale jeśli funkcja ta funkcja będzie tylko zadeklarowana w prostokat.h a zdefiniowana w prostokat.cpp i taka funkcja będzie przyjmować referencje lub wskaźnik do Punkt, to wystarczy, że tylko zadeklarujesz sobie Punkt (`class Punkt;`) w prostokat.h, a #include "punkt.h" dasz w prostokat.cpp.
komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)
Kiedy probuje dodać  #include "punkt.h" w prostokat.h to wyskakuje mi błąd w pliku punkt.h

||=== Build: Debug in hitbox (compiler: GNU GCC Compiler) ===|
C:\Users\Maks\Desktop\CodeBlock\hitbox\punkt.h|4|error: redefinition of 'class Punkt'|
C:\Users\Maks\Desktop\CodeBlock\hitbox\punkt.h|4|error: redefinition of 'class Punkt'|
C:\Users\Maks\Desktop\CodeBlock\hitbox\punkt.h|4|error: previous definition of 'class Punkt'|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
C:\Users\Maks\Desktop\CodeBlock\hitbox\punkt.h|4|error: previous definition of 'class Punkt'|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)

Poczytaj nt. include guards

tldr: powinno starczyć na początku każdego pliku *.h dodać

#pragma once
komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)
dodalem #pragma once w pierwsej linijce w prostokat.h i punkt.h ale dalej twierdzi ze "Prostokat" nie jest zadeklarowany w punkt.h i odwrotna sytuacjia w prostokat.h brak "Punkt"

przez to nie moge zaprzyjaznic funkcji sedzia
komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)

No jeśli te dwa pliki nawzajem sie includują, to nic dziwnego. Pliki nie mogą się nawzajem includować, bo w grafie zależności powstaje cykl. W takim wypadku, możesz zrobić tak, żebyś mógł

Ale jeśli funkcja ta funkcja będzie tylko zadeklarowana w prostokat.h a zdefiniowana w prostokat.cpp i taka funkcja będzie przyjmować referencje lub wskaźnik do Punkt, to wystarczy, że tylko zadeklarujesz sobie Punkt (`class Punkt;`) w prostokat.h, a #include "punkt.h" dasz w prostokat.cpp.

jak opisalem wyżej 

komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)
Tego właśnie nie rozumiem jak mam to zrobić
komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)
Najlepiej jakbyś pokazał swój aktualny cały kod z podzialem na pliki
komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)

main

#include <iostream>
#include "punkt.h"
#include "prostokat.h"


using namespace std;

int main()
{
    Punkt pkt1;
    //pkt.wczytaj();
    Prostokat p1;
  //  p.wczytaj();


    return 0;
}

punkt.h

#include <iostream>

using namespace std;


class Punkt
{

    string name;
    float x,y;
public:
    Punkt(string="A",float=0,float=0);
    void wczytaj();
};

punkt.cpp

#include <iostream>
#include "punkt.h"

using namespace std;

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

void Punkt::wczytaj()
{
    cout<<"Podaj nazwe punktu: ";cin>>name;
    cout<<"Podaj x: ";cin>>x;
    cout<<"Podaj y: ";cin>>y;

}

prostokat.h

#include <iostream>

using namespace std;

class Prostokat
{

string name;
float x,y,szerokosc,wysokosc;
public:
Prostokat(string="A",float=0,float=0,float=1,float=1);
void wczytaj();
void sedzia(Punkt pkt, Prostokat p);
};

prostokat.cpp

#include <iostream>
#include "prostokat.h"
#include "punkt.h"
using namespace std;
Prostokat::Prostokat(string n,float xx,float yy,float s,float w)
{
    name=n;
    x=xx;
    y=yy;
    szerokosc=s;
    wysokosc=w;
}
void Prostokat::wczytaj()
{
    cout<<"Podaj nazwe prostokata: ";cin>>name;
    cout<<"Podaj x: ";cin>>x;
    cout<<"Podaj y: ";cin>>y;
    cout<<"Podaj szerokosc: ";cin>>szerokosc;
    cout<<"Podaj wysokosc: ";cin>>wysokosc;
}
void Prostokat::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<<"tafiles"<<endl;
    else
        cout<<"Nie trafiles"<<endl;
}

 

komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)

I chcesz, Prostokat::sedzia byla friendem klasy Punkt?

Do prostokat.h dodaj nad definicją klasy Prostokat deklaracje klasy Punkt i wyrzuć #include "punkt.h". Tj.:

class Punkt;

Natomiast sygnature Prostokat sedzia zamien na

void sedzia(const Punkt& pkt, const Prostokat& p)

W taki sposób przyjmujesz obiekt pkt (oraz p ale to tutaj mniej istotne) przez reference i nie potrzebujesz znać definicji Punkt w momencie deklaracji funkcji. Dodatkowo zapobiegasz kopiowaniu obiektów bez wyraźnego powodu - kod powinien wyglądać w ten sposób nawet bez obecnego problemu.
(swoją drogą po co ten prametr p skoro sedzia juz jest metoda klasy Prostokat?)

Natomiast #include "punkt.h" umieść w prostokat.cpp bo tam już jest ci potrzebna definicja Punkt

komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)

czyli zamiast pisac p.x moge pisac poprostu x i wtedy moge usunac const Prostokat&p? 

void sedzia(const Punkt& pkt)

 

komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)
Tak, wtedy sedzia bedzie sprawdzal czy punkt lezy w obiekcie prostokata na ktorym zostal wywolany sedzia. np. x.sedzia(y) - sedzia sprawdza czy y leży wewnatrz x
komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)

Ale dalej tweirdzi mi ze rzeczy z class Punkt sa prywatne

dodalem do tamtej klasy taka linijke:

    friend void sedzia(const Punkt &pkt);

 

komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)
A chciales dodać Prostokat::sedzia. Globalna sedzia nawet nie istnieje
komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)
friend void Prostokat:: sedzia(const Punkt &pkt);

jezeli w takim sensie to wtedy wyskakuje mi bład ze Prostokat nie zostal zadeklarowany 

komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)
Daj #include "prostokat.h" w punkt.h, myslalem ze to juz masz
komentarz 13 marca 2019 przez Rokhar Nowicjusz (170 p.)
i jak mam teraz wywolac tego sedzia w mainie?
komentarz 13 marca 2019 przez criss Mędrzec (172,590 p.)
Stary, zrób coś sam, serio XD
komentarz 14 marca 2019 przez Rokhar Nowicjusz (170 p.)
edycja 14 marca 2019 przez Rokhar

Dzieki za wytlumaczenie jak dla idioty:P Pytalem sie o tego sedziego bo jak glupi pisalem w mainie

 Prostokat.sedzia(pkt1);

I nie rozumialem o co chodzi dopiero gdy doszlo do mnie co zrobilem to juz teraz to rozumiem. A bylem juz sfrustrowany, że ciagle nie rozumialem jakies rzeczy.

komentarz 15 marca 2019 przez criss Mędrzec (172,590 p.)
Trzeba było pokazać swój aktualny kod :P Po prostu nie chciałem za ciebie pisać wszystkiego

Podobne pytania

0 głosów
1 odpowiedź 1,193 wizyt
pytanie zadane 30 marca 2019 w C i C++ przez waslaw89 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 13 września 2019 w C i C++ przez Aedin Początkujący (320 p.)
0 głosów
3 odpowiedzi 608 wizyt
pytanie zadane 16 lutego 2018 w Offtop przez Paweł123 Nałogowiec (33,500 p.)

92,614 zapytań

141,458 odpowiedzi

319,768 komentarzy

61,995 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!

...