2013-04-04 5 views
0

У меня есть следующий заголовок:Классов и недействительные указатели

class MyClass { 
private: 
    static void (*OnRequest)(); 
    static void (*OnReceive)(int numBytes); 

public: 
    MyClass(); 

    static void SetOnReceive(void (*function)(int)); 
    static void SetOnRequest(void (*function)(void));  

}; 

void NonClassFunction(); 

и следующее заявление:

#include "MyClass.h" 
MyClass::MyClass() { 
... 
} 

void MyClass::SetOnReceive(void (*function)(int)) { 
    OnReceive = function; 
} 

void MyClass::SetOnRequest(void (*function)(void)) { 
    OnRequest = function; 
} 

void NonClassFunction() { 
    MyClass::OnRequest(); 
} 

Код компилируется нормально, но я получаю следующие ошибки, когда я связываю:

неразрешенный символ MyClass :: OnReceive, сначала ссылающийся на ./src/MyClass.obj
unreso lved символ MyClass :: OnRequest, первая ссылка в ./src/MyClass.obj

мне нужно OnRequest и OnReceive функционировать как обратный вызов через NonClassFunction(). Функция NonClassFunction вызывается прерыванием, поэтому здесь происходит немного объектно-ориентированного манипулирования. MyClass предназначен для наследования. В идеале я бы хотел, чтобы OnRequest и OnReceive были виртуальными, но вы не можете делать статические методы виртуальными.

+0

Из comp.lang.C++ FAQ: http://www.parashift.com/c++- faq/link-errs-static-data-mems.html – jamesdlin

ответ

1

Это ошибка компоновщика, что означает, что элементы не. Они только объявили.

Члены указателя являются членами static, поэтому им требуется определение, которое находится за пределами класса.

ли это в файле .cpp:

void (*MyClass::OnRequest)(); 
void (*MyClass::OnReceive)(int); 

Это определения, и то, что вы написали в классе только декларации.

Обратите внимание на позицию * в приведенных выше определениях. Небольшая ошибка, такая как:

void (MyClass::*OnRequest)(); //notice the difference 
void (MyClass::*OnReceive)(int); //notice the difference 

полностью изменит значение! Теперь это указатели-не-статические функции-члены. Так что знайте разницу и будьте осторожны. :-)

+1

Спасибо. Я попробовал что-то ближе к тому, что вы сказали, чтобы не делать void MyClass :: (* OnRequest)(); и он не будет компилироваться.Я пробовал то, что вы сказали, и отлично работал. Еще раз спасибо. – zam664

1

Эти две переменные в заголовке:

static void (*OnRequest)(); 
static void (*OnReceive)(int numBytes); 

не были определены.

Определите их в своем файле cpp.

void (*MyClass::OnRequest)(); 
void (*MyClass::OnReceive)(int); 
1

Вы указали объявления указателей функций, но не определение. Добавьте это в один файл CPP:

void (*MyClass::OnRequest)(); 
void (*MyClass::OnReceive)(int); 
0

я задал тот же вопрос недавно how-to-send-a-message-to-the-class-that-created-the-object

enemies_array[0].enemy = new Enemy(this,&Game::EnemyEvent); 

typedef void (Game::*ChangeFunc)(DWORD &) 
Class Enemy 
{ 
private: 
    ChangeFunc iChange; 
    Game *pGame; 
}: 

Enemy(Game *pCreatorGame, ChangeFunc iChangeHandler) 
{ 
    iChange = iChangeHandler; 
    pGame = pCreatorGame; 
} 

void Enemy::Draw(D3DGraphics& gfx) 
{ 
    (pGame->*iChange)(this->dwThreadID); 
Смежные вопросы