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

Ваш аккаунт

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

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

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

Проблема с указателем на функцию

1.9K
16 сентября 2006 года
WWTLF
35 / / 16.06.2003
создал такой класс
Код:
class myclass {
Public:
void (*onget)(char *);
void doit(){
        (*onget)("PROVERKA");
}
};

void MyFunc(char s[30])
{
printf("%s",s);
}

int main(......)
{
myclass a;
a.onget = &MyFunc;
a.doit();
}

Вот так все работает прекрасно...
но если объявлять указатель на класс
 
Код:
int main(......)
{
myclass *a;
a->onget = &MyFunc; // На этой строке программа обрывается с ошибкой
a->doit();
}

типа не могу прочитать с адреса 0x00000001

Подскажите в чем проблема. Спасибо
860
16 сентября 2006 года
Abell2000
138 / / 15.01.2003
Странно,
только что скопировал твой код и все прекрасно работает в обоих случаях.
1.9K
16 сентября 2006 года
SABROG
242 / / 26.01.2006
 
Код:
int main(......)
{
myclass *a; // тут у тебя объявляется указатель на класс
a->onget = &MyFunc; // На этой строке программа обрывается с ошибкой
a->doit();
}


В твоем коде я не увидел объявление экземпляра класса. Т.е. внутри указателя у тебя в принципе может быть любой мусор.

попробуй так, если тебе обязательно надо работать с указателем:

 
Код:
int main(......)
{
myclass *b;
mycalss a;
b = &a;
b->onget = &MyFunc;
b->doit();
}


или так, если достаточно одного объекта класса:

 
Код:
int main(......)
{
mycalss a;
a.onget = &MyFunc;
a.doit();
}
725
18 сентября 2006 года
UnErase
190 / / 08.06.2006
Попробуй еще после объявления указателя
 
Код:
myclass *a;

выделить память под него:
 
Код:
a = new myclass;
309
20 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Всё правильно - просто в первом случае обращение производится к объекту в стеке, а во втором - к указателю на объект.
Объект, свойству которого присваивается указатель на функцию не существует, а указатель на объект является неопределённым.
 
Код:
function (....)
{[INDENT]myclass *a = new myclass(); // Создание объекта в куче
a->onget = &MyFunc; a->doit();a->onget = &MyFunc;
a->doit();
delete a; // Удаление объекта из кучи[/INDENT]}

Вот так правильно. WWTLF, учи "выделение памяти"
1.9K
21 сентября 2006 года
WWTLF
35 / / 16.06.2003
Спасибо) я в тот же день догал в чем проблема...
под класс надо выделять память = new myclass();
иначе указатель показывает на что попало....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог