Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Траблы с указателем на функцию / 5 сообщений из 5, страница 1 из 1
06.04.2007, 22:53
    #34444822
Riven
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с указателем на функцию
Есть функция (в .h заголовке), которую я вызываю из DLL.

Код: plaintext
void RVT_RegisterCallback(int iType, LPVOID pCallback);

Второй параметр - это указатель на callback-функцию, которую нужно описать и реализовать самому.

Собсно код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
class CDataLoader : public CObject
...

// Callback функция
void CALLBACK CDataLoader::OnData(P_DATA data)
{
    return;
}

void CDataLoader::Connect()
{
    // Ее регистрация
    XTW_RegisterCallback( 15 , this->OnData);
}

Ругается - cannot convert parameter 2 from 'void (struct tagDATA *)' to 'void *'

Если же сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
class CDataLoader : public CObject
...

// Callback функция, только уже вне класса
void CALLBACK test(P_DATA data)
{
    return;
}

void CDataLoader::Connect()
{
    // Ее регистрация
    XTW_RegisterCallback( 15 , test);
}

То все ок...

Не вкуриваю я эту тему :) Просьба не пинать, в С++ я можно сказать ламер.
...
Рейтинг: 0 / 0
07.04.2007, 00:30
    #34444875
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с указателем на функцию
Ругается - cannot convert parameter 2 from 'void (struct tagDATA *)' to 'void *'

1) Делать "this->data" нельзя. а вот "&CDataLoader::data" можно. Подробности в справке в разделе pointers to members. Но только работать оно не будет так как надо (см пункт 2)
2) Метод класса при вызове неявно передает указатель this. Т.е. функция должна быть статичной, либо не входить в класс, чтобы работать как Callback.

ЗЫ. Это уже где-то обсуждалось на форуме...
...
Рейтинг: 0 / 0
07.04.2007, 10:55
    #34445025
Riven
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с указателем на функцию
Гм, сделал функцию статической - все ок. Другая проблема. Все атрибуты класса, с которыми она работает, я тоже сделал статическими. Когда я пытаюсь их использовать в этой функции, вылетает ошибка:
DataLoader.obj : error LNK2001: unresolved external symbol "public: static int CDataLoader::m_test" (?m_test@CDataLoader@@2HA)

Код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class CDataLoader : public CObject
{
...
// Implementation
public:
	static int m_test;
...
	static void CALLBACK OnData(P_DATA data);
};

void CALLBACK CDataLoader::OnData(P_DATA data)
{
	CDataLoader::m_test =  234 ;

	return;
}

Спасибо!
...
Рейтинг: 0 / 0
07.04.2007, 11:11
    #34445035
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с указателем на функцию
RivenГм, сделал функцию статической - все ок. Другая проблема. Все атрибуты класса, с которыми она работает, я тоже сделал статическими. Когда я пытаюсь их использовать в этой функции, вылетает ошибка:
DataLoader.obj : error LNK2001: unresolved external symbol "public: static int CDataLoader::m_test" (?m_test@CDataLoader@@2HA)

Код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class CDataLoader : public CObject
{
...
// Implementation
public:
	static int m_test;
...
	static void CALLBACK OnData(P_DATA data);
};

void CALLBACK CDataLoader::OnData(P_DATA data)
{
	CDataLoader::m_test =  234 ;

	return;
}

Спасибо!
Правильно тебя обругали, ты не определил переменную CDataLoader::m_test, не отвел под нее компилятор места. А чтобы определить ее в cpp вне тела методов и функций надо написать
int CDataLoad::m_test = 0;
...
Рейтинг: 0 / 0
08.04.2007, 01:26
    #34445541
Riven
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с указателем на функцию
Спасибо, все супер, все работает :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Траблы с указателем на функцию / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]