Program nie znajduje metody klasy z innego pliku

0

Chciałem stworzyć program, który sprawdza, czy podany punkt znajduje się w obrębie podanego prostokąta na układzie współrzędnych. Stworzyłem do tego dwie klasy (Punkt i Prostokat), a także metodę "sedzia".

main:

#include <iostream>
#include <string>
#include "headers.h"

using namespace std;


int main()
{
	Punkt punkt("A", 2, 2);
	Prostokat prostokat("ABCD", 1, 1, 2, 2);

	sedzia(punkt, prostokat);

	

	return 0;
}

headers.h:

#include <iostream>
#include <string>

using namespace std;

class Prostokat;

class Punkt
{

	string nazwa;
	float x, y;

public:

	Punkt(string, float, float);

	friend class Prostokat;

};

class Prostokat
{
	string nazwa;
	float x, y, szer, wys;

public:

	Prostokat(string, float, float, float, float);

	void sedzia(Punkt pkt, Prostokat p);

};

headers.cpp

#include <iostream>
#include <string>
#include "headers.h"

using namespace std;


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



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

	void Prostokat::sedzia(Punkt pkt, Prostokat p)
	{
		if ((pkt.x >= p.x) && (pkt.x <= p.x + p.szer) && (pkt.y >= p.y) && (pkt.y <= p.y + p.wys))
			cout << "Punkt " << pkt.nazwa << " należy do prostokąta " << p.nazwa << endl;
		else
			cout << "Punkt " << pkt.nazwa << " nie należy do prostokąta " << p.nazwa << endl;
	}

Przy próbie kompilacji otrzymuję błąd, że funkcja "sedzia" nie jest zdefiniowana ('sedzia': identifier not found).
Dlaczego tak się dzieje?

2

Metoda sedzia znajduje się w klasie Prostokat, wiec musi być wywołana na obiekcie prostokąt.

Punkt punkt("A", 2, 2);
Prostokat prostokat("ABCD", 1, 1, 2, 2);
 
Prostokat.sedzia(punkt, prostokat);
2

Próbujesz wywołać wolną funkcję sedzia. Jedyna zbliżona funkcja jaką masz jest elementem klasy Prostokat, więc taką musiałbyś wywołać, np. (chociaż wymaganie drugiej instancji prostokąta jest tutaj zbędne)

prostokat.sedzia(punkt, prostokat);
0

Uh, dzięki. Nie wiem jak mogłem tego nie ogarnąć.

2

sedzia to niestatyczna metoda klasy Prostokat, więc wołać należy na obiekcie tej klasy.

prostokat.sedzia(...

Poza tym przekazanie parametru typu Prostokat jest niepotrzebne, bo skoro wołasz to na obiekcie typu Prostokat to masz dostęp do tego obiektu.

Nie stosuj using namespace w plikach nagłówkowych.
Po co deklaracja poprzedzająca class Prostokat;?
Po co friend class Prostokat;?

0

@twonek:

  1. Kiedy usunąłem z pliku .h "using namespace std" program zaczął wyrzucać mi dziwne błędy i się nie skompilował.
  2. Wydawało mi się, że kompilator po napotkaniu "friend class Prostokat" musi wcześniej znać deklarację tej klasy.
  3. friend class Prostokat umieściłem po to, by z wnętrza tej klasy, używając metody sedzia, mieć dostęp do prywatnych składników klasy Punkt.
1
  1. Dlatego że masz tam np. klasę std::string, więc należy zmienić string na std::string.
    using namespace std pozwala unikać pisania przedrostka std::, ale używanie tego w plikach nagłówkowych powoduje że każdy plik, który dołączy ten nagłówek będzie miał tę przestrzeń nazw dołączoną niezależnie czy tego chce czy nie.
  2. Źle Ci się wydawało.
  3. Klasa Punkt w tym przypadku powinna być strukturą z publicznymi polami.

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