class Proba {
private:
static void(*handler)(void);
static void test(void){return;}
public:
Proba(){handler = test;}
};
Член класса - указатель на функцию
Уважаемые кодеры, объясните, пожалуйста, вот какой момент.
Объявление:
Код:
Линкер парирует:
Код:
unresolved external symbol "private: static void (__cdecl* Proba::handler)
(void)"
(void)"
А я что-то не понимаю. Казалось бы какая разница: указатель (пусть даже и на функцию) - такая же переменная-член, как илюбая другая и присутствует в этом же файле. Так чем же недоволен линкер?
Цитата: assign
Так чем же недоволен линкер?
Твоими познаниями языка :)
Указатель СТАТИЧЕСКИЙ ты объявил, но нигде не определил. Как и любой другой СТАТИЧЕСКИЙ член, после объявления он должен быть ещё и определен (вне определения класса):
Код:
void (*Proba::handler)(void);
Код:
void (*Proba::handler)(void) = 0;
Кстати, я сейчас, основываясь на твоей подсказке, экспериментально выяснил, что правило:
Цитата: Green
...Как и любой другой СТАТИЧЕСКИЙ член, после объявления он должен быть ещё и определен (вне определения класса).
в отношении статических членов, не являющихся указателем на функцию, не работает. Со статическими членами, например, типов int и int* таких проблем не возникает.
Наверно забыл маленькую детальку:
Код:
class Proba {
private:
static int i;
public:
Proba(){}
};
[SIZE=2]
private:
static int i;
public:
Proba(){}
};
[SIZE=2]
и
Код:
[SIZE=2]class Proba {[/SIZE]
[SIZE=2]private:[/SIZE]
[SIZE=2]static int i;[/SIZE]
[SIZE=2]public:[/SIZE]
[SIZE=2]Proba(){ i =0; }[/SIZE]
[SIZE=2]};
[SIZE=2]private:[/SIZE]
[SIZE=2]static int i;[/SIZE]
[SIZE=2]public:[/SIZE]
[SIZE=2]Proba(){ i =0; }[/SIZE]
[SIZE=2]};
[/SIZE]
Цитата: assign
Кстати, я сейчас, основываясь на твоей подсказке, экспериментально выяснил, что правило:
в отношении статических членов, не являющихся указателем на функцию, не работает. Со статическими членами, например, типов int и int* таких проблем не возникает.
в отношении статических членов, не являющихся указателем на функцию, не работает. Со статическими членами, например, типов int и int* таких проблем не возникает.
Что значит "не работает"?
Как уже показал vAC, проблемы возникнут, как только ты попытаешься обратиться к неопределенному члену.
P.S. советую ознакомиться со стандартом языка или хотя бы почитать литературу по языку прежде, чем ставить эксперименты и на их основании что-либо утверждать.