Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование указателя на функцию-член класса 
V
    Опции темы
fear
Дата 19.6.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Следующий код выводит надпись "writeFunc"
Код

void readFunc(){cout<<"readFunc"<<endl;}
void writeFunc(){cout<<"writeFunc"<<endl;}
void readWriteFunc(void (*x)()){x();}

void main()
{
  readWriteFunc(writeFunc);
}


А этот, ошибку компилятора "error C3867: 'A::readFunc': function call missing argument list; use '&A::readFunc' to create a pointer to member"
Код

class A
{
  public:
    A(){};
    ~A(){};

    void readWriteFunc(void (*x)()){x();}
    void readFunc(){cout<<"readFunc"<<endl;}
    void writeFunc(){cout<<"writeFunc"<<endl;}
};

void main()
{
  A a;
  a.readWriteFunc(a.readFunc);
}


Почему так?
PM MAIL   Вверх
bsa
Дата 19.6.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Тебе же все написали. Чтобы взять адрес метода класса, нужно использовать операцию: &ClassName::methodName;
А чтобы его использовать: a.*methodName() или a->*methodName();
А чтобы описать указатель на член класса: type (*ClassName::func)(<params>);
Например:
Код
struct SomeThing
{
      void method1();
      void (*SomeThing::method)();
};
main()
{
    SomeThing a;
    a.method = &SomeThing::method1;
    a.*method();
}

PM   Вверх
Xenon
Дата 19.6.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



bsa, только
Код

type (ClassName::*func)(<params>); //Вот так
type (*ClassName::func)(<params>); //А не так

И
Код

(a.*methodName)() //Так
(a->*methodName)(); //И так
//А не так
a.*methodName();
a->*methodName();




--------------------
user posted image  
PM MAIL   Вверх
sparn
Дата 19.6.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.5.2006

Репутация: нет
Всего: 1



в первом слу
Цитата(fear @  19.6.2007,  11:24 Найти цитируемый пост)
Следующий код выводит надпись "writeFunc"
...
А этот, ошибку компилятора "error C3867: 'A::readFunc': function call missing argument list; use '&A::readFunc' to create a pointer to member"
...
Почему так? 


В первом случае передаваемая в качестве параметра функция является статической - то есть она существует всегда(образно говоря smile ), во втором случае функция: "фактически не существует без объекта-представителя класса, определение указателя на компонент класса (член класса или функцию-член) отличается от определения указателя на объект или обычную функцию." © Марченко А.Л. "C++. Бархатный путь."

Это сообщение отредактировал(а) sparn - 19.6.2007, 12:20
PM MAIL   Вверх
Xenon
Дата 19.6.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



То что мы называем указателем на член по сути является смещением.


--------------------
user posted image  
PM MAIL   Вверх
fear
Дата 19.6.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Изменил код, получил ошибку в последней строке "error C2065: 'readWriteFunc' : undeclared identifier".
Код

class A
{
  public:
    A(){};
    ~A(){};

    void (A::*readWriteFunc)();
    void readFunc(){cout<<"readFunc"<<endl;}
    void writeFunc(){cout<<"writeFunc"<<endl;}
};

void main()
{
  A a;
  a.readWriteFunc = &A::readFunc;
  (a.*readWriteFunc)();
}

PM MAIL   Вверх
likehood
Дата 19.6.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Судя по твоему первому посту, тебе нужен такой код:
Код

class A
{
  public:
    A(){};
    ~A(){};

    void readWriteFunc(void (A::*f)()) { 
        (this->*f)();
    }
    void readFunc(){cout<<"readFunc"<<endl;}
    void writeFunc(){cout<<"writeFunc"<<endl;}
};

void main()
{
  A a;
  a.readWriteFunc(A::readFunc);
  a.readWriteFunc(A::writeFunc);
}

PM MAIL   Вверх
bsa
Дата 19.6.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Xenon @ 19.6.2007,  11:45)
bsa, только
Код

type (ClassName::*func)(<params>); //Вот так
type (*ClassName::func)(<params>); //А не так

И
Код

(a.*methodName)() //Так
(a->*methodName)(); //И так
//А не так
a.*methodName();
a->*methodName();

Сорри. Использовал только пару раз, поэтому подзабыл smile

fear
Измени код вызова на:
(a.*(a.readWriteFunc))();

Я немного запутал всех. readWriteFunc - это же член класса. Поэтому сначала его надо извлечь, а затем уже применять вызов. Если бы у тебе readWriteFunc был просто в main() объявлен, то все бы работало.
PM   Вверх
fear
Дата 19.6.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Спасибо всем большое за разъяснения. Теперь всё встало на свои места. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.