Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2010, 13:43   #1
_Art_
 
Регистрация: 18.12.2009
Сообщений: 9
По умолчанию Указатель на метод класса

Всем доброе утро!

В объявлении класса SignalMathHandler объявляю указатель на метод этого же класса :

bool (__thiscall SignalMathHandler::* funcPointer)(); указываю явно __thiscall, тк указатель по умолчанию создается на функцию с соглашением __cdecl.

метод соответственно таков:
.h:
bool signalAnalysis();
.cpp:
bool SignalMathHandler::signalAnalysis() {
return true;
}


присваиваю метод указателю и пытаюсь вызвать:
funcPointer = &SignalMathHandler::signalAnalys is;

(*funcPointer)();

\signalmathhandler.cpp(116) : error C2171: '*' : illegal on operands of type 'bool (__thiscall SignalMathHandler::* )(void)'
\signalmathhandler.cpp(116) : error C2064: term does not evaluate to a function taking 0 arguments

или
funcPointer()

error C2064: term does not evaluate to a function taking 0 arguments

Подскажите, пожалуйста как сделать?
Заранее спасибо!
_Art_ вне форума Ответить с цитированием
Старый 01.04.2010, 17:34   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

а как ты собрался вызвать пусть даже указатель на функцию без объекта? если конечно твоя функция не статическая

Код:
SignalMathHandler obj;
(obj.*funcPointer)();
да и thiscall мне кажется тут не нужно писать. разве user defined методы вызываются по thiscall в билдере? я думал это только в vcl.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.04.2010, 18:52   #3
_Art_
 
Регистрация: 18.12.2009
Сообщений: 9
По умолчанию

Уже разобрался. Это не билдер, а VS. Указатель на метод - private, так что вызывать не пытался, но можно попробовать..
Надо было сделать так:
(this->*funcPointer)();
_Art_ вне форума Ответить с цитированием
Старый 01.04.2010, 18:55   #4
_Art_
 
Регистрация: 18.12.2009
Сообщений: 9
По умолчанию

А без объекта я и не пытался, код (*funcPointer)(); писал для вызова из метода класса, видимо не совсем корректно поставил вопрос...
_Art_ вне форума Ответить с цитированием
Старый 01.04.2010, 18:55   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
(this->*funcPointer)();
ну ты кагбэ не сказал, что хочешь вызвать из своего же класса метод по указателю.

я так и не понял, зачем указатель на метод создавать с указанием thiscall. твой метод так же описан? или у тебя по умолчанию все методы через thiscall вызываются? если так, то зачем?

Цитата:
видимо не совсем корректно поставил вопрос...
видимо оно так и есть
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 03.04.2010, 01:26   #6
_Art_
 
Регистрация: 18.12.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение

я так и не понял, зачем указатель на метод создавать с указанием thiscall. твой метод так же описан? или у тебя по умолчанию все методы через thiscall вызываются? если так, то зачем?
Я так понимаю в Visual Studio все методы по умолчанию вызываются с соглашением thiscall, тк при вызове метода надо сохранять указатель this, а cdecl и stdcall этого не делают. Я его просто явно прописал туда.

Если ошибаюсь, поправьте...
_Art_ вне форума Ответить с цитированием
Старый 03.04.2010, 01:45   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

мне кажется, что студия (да и любой ++ компилятор) сама пронюхает, что это не просто функция, а метод, поэтому соглашение о вызове само подставится. во всяком случае я никогда явно не указывал (за исключением экспортируемых функций из библиотек и тп)

пс. я кстати сначала перепутал thiscall с fastcall.


кстате вот чо пишут
Цитата:
Заметьте, что используется специальный оператор ( ::* ), а при объявлении используется класс SomeClass. Указатели на функции-члены имеют очень серьезное ограничение – они могут указывать лишь на функции-члены одного класса. Различным комбинациям аргументов, типам константности и различным классам соответствуют различные указатели на функции-члены. В MSVC , кроме того, указатели различаются по типу соглашения о вызове: __cdecl, __fastcall, __stdcall и __thiscall (__thiscall по умолчанию. Заметим, что документированного квалификатора __thiscall нет, но он иногда появляется в сообщениях об ошибках. Если вы попробуете использовать его явно, то получите сообщение об ошибке, информирующей о том, что использование этого квалификатор зарезервировано для будущих нужд.)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 03.04.2010 в 01:50.
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в базовом классе описать указатель на объект производного класса? MasterGH Общие вопросы C/C++ 3 16.11.2009 02:55
Метод Synchronize класса TThread EdNovice Общие вопросы Delphi 10 01.08.2009 14:47
Метод класса REztor Помощь студентам 2 14.04.2009 17:10
Метод к полям класса; vovunisaev Общие вопросы C/C++ 2 08.04.2009 14:19
Метод без класса Altera Общие вопросы Delphi 12 24.12.2008 15:22