LINUX.ORG.RU

C++ вызвать указатель на метод класса внутри метода класса?

 ,


0

2

Приветствую

Объявил внутри класса «переменную» как void (CJpgFrame::*Write)();

Внутри метода класса присваиваю этой «переменно» функцию как Write = &CJpgFrame::WritePckWithTime;

Понятно, что вне класса вызов

CJpgFrame jpg();
(jpg.*jpg.Write)();

но как вызвать ВНУТРИ метода самого класса? или это не поддерживается?

валится ошибка

Recoder.cpp:85:11: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((CJpgFrame*)this)->CJpgFrame::Write (...)’, e.g. ‘(... ->* ((CJpgFrame*)this)->CJpgFrame::Write) (...)’
     Write();
           ^

Переопределять не хочется, т.к. там всего лишь ветвление в if чтобы не повторять.

★★★

Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от slovazap

дак если бы, не помогает так указать

wolverin ★★★
() автор топика

Внутри метода класса присваиваю этой «переменно» функцию как Write = &CJpgFrame::WritePckWithTime;

А в Java так можно?

X512 ★★★★★
()

Может mem_fn? У этих указателей на члены инопланетный синтаксис, без бутылки никак, а если разобрался, то вылетит из головы быстро и потом разбираться заново, с mem_fn всё проще

#include <functional>

struct S {
	void fn() {}
	void call() {
		auto f = std::mem_fn(&S::fn);
		f(this);
	}
};

int main() {
	S s;
	s.call();
}
kvpfs ★★
()
Последнее исправление: kvpfs (всего исправлений: 1)
Ответ на: комментарий от X512

Можно, ссылки на методы там есть. Реализованы через интерфейсы с ровно одним методом. (Читай - через зад.)

ArrayList<MyClass> l = ...;
Collections.sort(l, (a, b)=>a.isGreaterThan(b));
// эквивалентно
Collections.sort(l, MyClass::isGreaterThan);
lwo
()
Последнее исправление: lwo (всего исправлений: 1)
Ответ на: комментарий от wolverin

Язык всеми силами старался не дать тебе наговнокодить, но когда ты сказал ему - нет, я буду говнокодить и точка, он подвинулся, и даже подсказал как записать говнокод. Более того - говнокод остался вызывающе бросающимся в глаза. Не забудь это вспомнить, когда будешь переходить на что-то хайповое.

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от wolverin

(((CJpgFrame*)this)->*CJpgFrame::Write)();

??? если переменная в этом классе(CJpgFrame), внутри метода класса и даже наследника по идее так:

(this->*Write)();

вот кодик

struct Test{
	bool ( Test:: *_method_ptr) ();
	
	bool ff(){	return true; }
	
	bool test_func(){
		_method_ptr = &Test::ff; ///assignment
		return (this->*_method_ptr)(); ///call method pointer
	}
};
alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от lwo

Это несколько другое. Тут создаётся лямбда с обычным вызовом метода (и передачей всех параметров) а не указатель на метод.

X512 ★★★★★
()
Ответ на: комментарий от alysnix

alysnix

О, спасибо, так действительно покороче )

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.