Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Член класса - указатель на функцию

5.9K
29 января 2009 года
assign
60 / / 13.12.2005
Здравствуйте?
Уважаемые кодеры, объясните, пожалуйста, вот какой момент.

Объявление:
Код:
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)"


А я что-то не понимаю. Казалось бы какая разница: указатель (пусть даже и на функцию) - такая же переменная-член, как илюбая другая и присутствует в этом же файле. Так чем же недоволен линкер?
3
29 января 2009 года
Green
4.8K / / 20.01.2000
Цитата: assign
Так чем же недоволен линкер?


Твоими познаниями языка :)

Указатель СТАТИЧЕСКИЙ ты объявил, но нигде не определил. Как и любой другой СТАТИЧЕСКИЙ член, после объявления он должен быть ещё и определен (вне определения класса):

 
Код:
void (*Proba::handler)(void);
505
29 января 2009 года
vAC
343 / / 28.02.2006
Потому что статическая переменная Proba::handler была только обьявлена, но не определена. Вставь его после определения класса например в таком виде:
 
Код:
void (*Proba::handler)(void) = 0;
5.9K
29 января 2009 года
assign
60 / / 13.12.2005
Да ты прав насчёт моих познаний C++... Чудной, ей богу, язык...
Кстати, я сейчас, основываясь на твоей подсказке, экспериментально выяснил, что правило:

Цитата: Green

...Как и любой другой СТАТИЧЕСКИЙ член, после объявления он должен быть ещё и определен (вне определения класса).



в отношении статических членов, не являющихся указателем на функцию, не работает. Со статическими членами, например, типов int и int* таких проблем не возникает.

505
29 января 2009 года
vAC
343 / / 28.02.2006
Для этого правила нет исключений ;)
Наверно забыл маленькую детальку:

 
Код:
class Proba {
private:
static int i;
public:
Proba(){}
};
[SIZE=2]
[/SIZE]
и
 
Код:
[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][SIZE=2]
[/SIZE]
3
29 января 2009 года
Green
4.8K / / 20.01.2000
Цитата: assign
Кстати, я сейчас, основываясь на твоей подсказке, экспериментально выяснил, что правило:

в отношении статических членов, не являющихся указателем на функцию, не работает. Со статическими членами, например, типов int и int* таких проблем не возникает.


Что значит "не работает"?

Как уже показал vAC, проблемы возникнут, как только ты попытаешься обратиться к неопределенному члену.

P.S. советую ознакомиться со стандартом языка или хотя бы почитать литературу по языку прежде, чем ставить эксперименты и на их основании что-либо утверждать.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог