Jak używać wskaźników do funkcji, które są elementami klasy?

0

Mam zdefiniowaną klasę:

class Pole
{
...
void (Pole::*poloz) (Element *, ListaElementow *, unsigned short int *);
...
void polozSrodek(Element *element, ListaElementow *lista, unsigned short int *nr);

void polozBok(Element *element, ListaElementow *lista, unsigned short int *nr);
...
};

gdzieś potem ustawiam wstaźniki i poloz na Pole::polozSrodek lub Pole::polozBok. Potem próbuję wywołać funkcję na którą pokazuje mi ten wskaźnik:

(indeks[pole].*poloz)(start, elementy, nr);

indeks[] to oczywiście tablica typu Pole
Podczas kompilacji wywala mi błąd:
error: ‘poloz’ was not declared in this scope

Co jest nie tak?

0

jaki jest szerszy kontekst? Gdzie wykorzystujesz ten symbol?
Może zapomniałeś o "Pole::" przed definicją/nazwą metody?

0

Zgaduję, że chodzi ci o to:

((indeks[pole]).*(indeks[pole].poloz))(start, elementy, nr);
0

na dwoje babka wróżyła. Dopóki nie będziemy znali kontekstu tej linijki z błędem, to możliwych odpowiedzi jest znacznie więcej.

0

A moze tu chodzi o roznice miedzy Method Pointer a Member Method Pointer?

0

Mam klasę Plansza:

class Plansza
{
	public:
                Plansza();
       		void ukladaj(ListaElementow *elementy, short int pole);
		
	private:
		Pole indeks[IPol];
		Pole* t[Max][Max];
};

class Pole
{
	public:
                Pole();
		friend class Plansza;

	private:
		void (Pole::*poloz) (Element *, ListaElementow *, unsigned short int *);
		void polozSrodek(Element *element, ListaElementow *lista, unsigned short int *nr);
		void polozBok(Element *element, ListaElementow *lista, unsigned short int *nr);
};

i klasę Pole w której tak jak to napisałem powyżej zdefiniowany jest wskaźnik 'poloz' ustawiany na funkcję polozSrodek lub polozBok dla każdego pola za pomocą konstruktora klasy Plansza.

Plansza::Plansza()
{
	for (int i=0; i<Max; i++)
		for (int j=0; j<Max; j++)
		{
                        t[i][j]=&indeks[j*Max+i];
			if (i==0 || j==0 || i==Max-1 || j==Max-1)
			{
				t[i][j]->poloz=&Pole::polozBok;
			}
			else
			{
				t[i][j]->poloz=&Pole::polozSrodek;
			}
		}
}

Funkcja na którą wskazuje wskaźnik jest uruchamiana z funkcji Plansza:

void Plansza::ukladaj(ListaElementow *elementy, short int pole)
{
	if (pole<IPol)
	{
		Element *start;
		
		short unsigned int *nr = new short unsigned int;
		*nr=0;
		
		while(indeks[pole].znajdz(&start, &elementy->lista[indeks[pole].fZera][indeks[pole].fKat], nr))
		{
			(indeks[pole].*poloz)(start, elementy, nr); // tu kompilator wyrzuca błąd error: ‘poloz’ was not declared in this scope
			ukladaj(elementy, pole+1);
			
			if (*nr < elementy->size())
				(*nr)++;
			else
				break;
		}
               ...
	}
}
0

Bo nie ma zmiennej poloz. Chodzi o wywołanie wskaźnika indeks[pole].poloz na obiekcie indeks[pole]? Jeśli tak, to napisałem wyżej jak to zrobić.

0

Dzięki Fanael, a to chodziło.

Tego linka co wysłałeś EgonOlsen widziałem, ale chyba niezbyt dokładnie go przejrzałem :]

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