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

Problem z wysyłaniem obiektów przez referencje

Object Storage Arubacloud
0 głosów
288 wizyt
pytanie zadane 8 lutego 2018 w C i C++ przez robzon1916 Początkujący (310 p.)

Siemanko. Robiąc sobie powtórzenie teorii przed Builderem, grzebiac w kodzie napotkałem mały błąd związany z przesyłaniem obiektów funkcji przez referencje. W komentarzach // w kodzie opisałem krok po kroku co robię.

 Mój kod :

main

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

using namespace std;

int main()
{
    Punkt pkt1;
    pkt1.wczytaj();

    Prostokat p1;
    p1.wczytaj();
    p1.sedzia(&pkt1,&p1); // 3. wysylam oryginalne obiekty funkcji i ja wywoluje

    return 0;
}

przyjaciele.h

#include <iostream>

using namespace std;


class Punkt
{
    string nazwa;
    float x,y;

public:
    Punkt(string="A",float=0,float=0);       
    void wczytaj();               

    friend void sedzia(); 
};



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(Punkt pkt, Prostokat p); // 1. ustawiam parametry formalne bez &
};

void sedzia() w przyjaciele.cpp

void Prostokat::sedzia(Punkt pkt, Prostokat p) // 2. tutaj także bez & 
{
    if ( (pkt.x>=p.x)&&(pkt.x<=p.x+p.szerokosc)
        &&(pkt.y>=p.y)&&(pkt.y<=p.x+p.wysokosc) )

    cout<<endl<<"Punkt "<<pkt.nazwa<<" nalezy do prostokata: "<<p.nazwa;
    else
    cout<<endl<<"Punkt "<<pkt.nazwa<<" lezy POZA prostokatem: "<<p.nazwa;
}

Kompilator pokazuje błąd:

In function 'int main()':
 no matching function for call to 'Prostokat::sedzia(Punkt*, Prostokat*)'|
|13|note: candidate is:
|29|note: void Prostokat::sedzia(Punkt, Prostokat)|
|29|note:   no known conversion for argument 1 from 'Punkt*' to 'Punkt'|

Mam wrażenie , że nie do końca rozumiem te przesyłanie obiektów przez referencje. Proszę o jakieś rady

1 odpowiedź

0 głosów
odpowiedź 8 lutego 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

w pliku przyjaciel.h zmień w klasie Punkt

//friend void sedzia();
// na
friend void sedzia(Punkt& p, Prostokat& pr);

Następnie popraw funkcje składową sędzia w klasie Prostokąt

void sedzia(Punkt& p, Prostokat& pr);

Dodatkowo w main.cpp usuń ampersand z funkcji sedzia.

p1.sedzia(&pkt1,&p1); // tutaj przesyłasz adresy do pkt i p1
p1.sedzia(pkt1,p1);// tutaj przesyłasz obiekty przez referencje

Może to pomoże.

komentarz 8 lutego 2018 przez robzon1916 Początkujący (310 p.)

Zmieniłem tak jak mówiłeś. Poprzednie błędy się nie pokazują , natomiast teraz doszedłem do problemu ,który mnie nurtuje od samego początku. Związany jest on jak widać z przyjaźnieniem się funkcji.

Kompilator twierdzi , że wszystkie atrybuty klasy Punkt (nazwa , x , y) są prywatne (nie wykonuje się funkcja na nich polegająca).

Mimo tego , że w klasie Punkt określiłem , że jest ona "przyjacielem domu" :D

    friend void sedzia(Punkt &p, Prostokat &pr);

oraz na wszelki wypadek NAD klasą Punkt dodałem informacje ,że będzie taka klasa jak Prostokat

class Prostokat; // info dla klasy Punkt ze bedzie taka klasa pozniej w kodzie

Jak to jest z tym przyjaznieniem sie funkcji? Dlaczego w tym przypadku nie działa?

komentarz 8 lutego 2018 przez j23 Mędrzec (194,920 p.)
friend void Prostokat::sedzia(Punkt &p, Prostokat &pr);

 

komentarz 8 lutego 2018 przez robzon1916 Początkujący (310 p.)

Nie pomogło. Po zmianie kompilator daje błędy:



|17|error: invalid use of incomplete type 'class Prostokat'|
|5|error: forward declaration of 'class Prostokat'|
komentarz 8 lutego 2018 przez Bondrusiek Maniak (61,370 p.)

Wczoraj był podobny temat

https://forum.pasja-informatyki.pl/324831/jak-pozwolic-metodzie-na-korzystanie-z-argumentow-innej-klasy

Ewentualnie możesz wywołać definicje funkcji składowej

void Punkt::sedzia(Punkt &p, Prostokat &pr);

i w niej odwoływać się do składników klasy.

komentarz 8 lutego 2018 przez j23 Mędrzec (194,920 p.)

Kompilator musi znać definicję klasy Prostokat przed deklaracją zaprzyjaźniającą metody  Prostokat::sedzia(). A najlepiej będzie jak zrobisz pola nazwa, x i y publiczne (ewentualnie zrób jakieś akcesory do nich).

Podobne pytania

0 głosów
1 odpowiedź 1,416 wizyt
pytanie zadane 12 listopada 2016 w JavaScript przez ReksetoDev Gaduła (4,530 p.)
0 głosów
2 odpowiedzi 788 wizyt
pytanie zadane 28 stycznia 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)
0 głosów
1 odpowiedź 244 wizyt

92,555 zapytań

141,403 odpowiedzi

319,556 komentarzy

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

...