Odwołanie się do metody innej klasy [C++]

Witam,

mam pewien problem. Mianowicie jest pewna klasa Rysunek i w niej jest metoda pobierzPiksel(). Mam też drugą klasę Logo i w niej metodę wypelnij(). Definiuję sobie obie metody (Rysunek::pobierzPiksel(int x, int y) oraz Logo::wypelnij(int x, int y, kolor kNowy), gdzie kolor to struktura RGBTRIPLE do obsługi koloru bitmapy. I teraz tak: chciałbym się odwołać do metody pobierzPiksel() w metodzie wypelnij(). Jak mogę takie coś zrobić?

Dzięki i pozdrawiam

Musisz sprawić aby klasa “Rysunek” była dostępna dla klasy “Logo”.

Plik “logo.cpp” musi mieć dostęp do “rysunek.h”, a w “rysunek.h” musisz mieć:

extern Rysunek rysunek_class; [/code]

Teraz w kodzie Logo::wypelnij(int x, int y) :

[code=php]Logo::wypelnij(int x, int y)

Dostaję następujący błąd:

Logo_mod.obj : error LNK2001: unresolved external symbol “class Rysunek rysunek_class” (?rysunek_class@@3VRysunek@@A)

IDE Visual C++ 2010

W pliku “rysunek.h” wpisz:

extern Rysunek rysunek_class; [/code]

W “logo.cpp” wpisz:

[code=php]#include “rysunek.h”    

Oczywiście zmień to, aby pasowało z nazwami twoich plików.

Powiem może co mam: plik Logo_mod.h i Logo_mod.cpp oraz main.cpp. W Logo_mod.cpp i main.cpp mam #include “Logo_mod.h”

PS. Ma znaczenie gdzie zapiszę extern? W sensie na początku czy na końcu pliku?

Zapomniałem!

W pliku z kodem klasy “Rysunek” wpisz:

Rysunek rysunek_class[/code]

Teraz zadziała.

Ale to musi być w klasie czy poza klasą? Jeśli poza to na początku czy na końcu pliku?

Jeżeli masz klasy “Rysunek” oraz “Logo” w jednym pliku z kodem to zrób tak:

// funkcje klasy RysunekRysunek rysunek_class;// funkcje klasy Logo [/code]

Teraz z kolei otrzymałem taki błąd: error C2512: ‘Rysunek’ : no appropriate default constructor available

Plik w którym to piszesz ma wpisane? :

#include "plik_naglowkowy_z_klasa.h"  [/code]

Tak, mam to na samej górze pliku

Dodane 14.12.2010 (Wt) 21:54

I co mam teraz z tym zrobić, żeby się wreszcie skompilował?

Dodane 25.12.2010 (So) 19:31

Niech ten post będzie odświeżającym temat.

Generalnie mój problem polega na tym, że muszę napisać funkcję pobierającą kolor danego piksela na ekranie, po czym mam porównać ten kolor z innym i jeśli będą różne to ten stary kolor mam zamienić na nowy.

Rysunek::Rysunek(const char* nazwaPliku, int szerokosc, int wysokosc, kolor tlo)

	: cx(szerokosc), cy(wysokosc)

{

	this->nazwaPliku = new char[strlen(nazwaPliku)+1];

	strcpy(this->nazwaPliku, nazwaPliku);


	this->bmp = new RGBTRIPLE[cx*cy];


	for (int i=0; i
}

Jakby się ktoś zastanawiał czym jest RGBTRIPLE:

struct RGBTRIPLE

{

	RGBTRIPLE(BYTE R, BYTE G, BYTE B) {r=R; g=G; b=B;}

	RGBTRIPLE() { }

	BYTE b, g, r;


	friend bool operator==(RGBTRIPLE x, RGBTRIPLE y)

	{

		if(x.r == y.r && x.g == y.g && x.b == y.b) return true;

		else return false;

	}

};

Metoda odpowiedzialna za postawienie piksela o danym kolorze:

void Rysunek::punkt(int x, int y, kolor k)

{

	if (x >= 0 && x < cx && y >= 0 && y < cy)

		bmp[y*cx+x] = k;

}

Teraz chciałbym mieć metodę zwracającą kolor piksela o zadanych współrzędnych.

kolor Rysunek::piksel(int x, int y)

{

        return bmp[xy-(x-1)*y-(x-1)*(y-1)]; //ale to nie działa

}

I wykorzystać ją w następującej metodzie klasy Logo:

void Logo::wypelnij(int x, int y, kolor kDocelowy)

{

       if(!( /*tutaj chcę się odwołać do metody Rysunek::piksel(x,y) */ ==kDocelowy))

       {

               rys->punkt(x,y,kDocelowy);

               wypelnij(x-1,y,kDocelowy);

               wypelnij(x+1,y,kDocelowy);

               wypelnij(x,y+1,kDocelowy);

               wypelnij(x,y-1,kDocelowy);

         }

}

Proszę o pomoc, siedzę nad tym problemem już dobre 2 tygodnie…