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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно передать указатель на функцию 
:(
    Опции темы
hsilgos
Дата 27.6.2009, 19:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

class Box 
{ 
public: 
void FuncP(void (*pf)()) {pf();} 
}; 

Box box_obj; 

class Just 
{ 
void Nismo() {} 
public: 
void Rel(); 
}; 
void Just::Rel() 
{ 
box_obj.FuncP(Nismo); 
/* на эту строчку ругается, что в вызове функции отсутствует список аргументов; используйте "&Just::Nismo" для создания указателя на член 

если сделать так box_obj.FuncP(&Just::Nismo); то ругается, что невозможно преобразовать параметр 1 из 'void (__cdecl Just::* )(void)' в 'void (__cdecl *)(void)' 
        Не существует контекста, в котором такое преобразование возможно 
*/ 
}

Естественно! Указатель на метод класса отличается от указателя на свободную функцию!
Цитата

void FuncP(void (Just::*pf)()) 


Добавлено @ 19:56
Вообще, чтобы вызвать нестатический метод класса, нужен указатель на объект и указатель на функцию.
И вызывать надо вот таким образом:

Цитата

class Just 
{ 
void Nismo() {} 
public: 
void Rel(); 
}; 

class Box 
{ 
public: 
void FuncP(Just *a_obj,void (Just::*pf)()) 
{
  ( a_obj->*pf)();
}
};

void Just::Rel() 
{ 
box_obj.FuncP(this,&Just::Nismo); 
}


Добавлено через 9 минут и 56 секунд
Цитата

Этот компилятор использую по причине того, что давно начал на нём делать и всё устраивало на 100%, на новый переводить очень затратно по причине разной реализации STL, а именно vector, который активно используется. В новой и старой STL по-разному реализованы добавление и удаление элементов в вектор, в новой добавление или удаление элемента влечёт полное переписование всего вектора в другую область памяти, что делает некоторые указатели на его элементы недействительными, а главное, тратит значительно больше ресурсов процессора, а скорость выполнения критична для проекта.

Работать, опираясь на это - очень большая ошибка. Рано или поздно где-то в коде это аукнется. У вас на 6-ке, возможно, это прокатывало, потому что добавляли/удаляли элементов не много, если же попробовать на больших объемах, думаю, прийдет кранты.


Да и кто мешает написать свой аллокатор и распределять память по-своему? Тогда ваши указатели останутся валидными всегда.

Это сообщение отредактировал(а) hsilgos - 27.6.2009, 19:57
PM MAIL   Вверх
jonie
Дата 27.6.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



в vc шаманские auto_prt-ы, их можно пихать в контейнеры 8)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Irdis
Дата 27.6.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ололололо O_o
как такое может прийти в голову??
(стало интересно)
PM MAIL   Вверх
hsilgos
Дата 28.6.2009, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

в vc шаманские auto_prt-ы, их можно пихать в контейнеры 8)

Вот реализация конструктора копирования в MSVC-шном (2005) STL-е.
Цитата

auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()// i.e. throw()
  : _Myptr(_Right.release())
  {    // construct by assuming pointer from _Right auto_ptr
  }

Всё по стандарту, пихать в контейнеры нельзя.  smile 
PM MAIL   Вверх
Riddik
Дата 28.6.2009, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



hsilgos, спасибо! 
Я до этого ещё не дошёл, немножко вперёд поезда забегаю.

А если такую функции надо передавать функции-члены разных классов, то нужно использовать указатель  на базовый класс, верно?
PM MAIL   Вверх
hsilgos
Дата 28.6.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

А если такую функции надо передавать функции-члены разных классов, то нужно использовать указатель  на базовый класс, верно?

Если использовать шаблон, то можно вообще любые классы. Главное, чтоб у метода совпадала сигнатура.
А что касается базового класса, я вот тут, чесно говоря, не знаю, безопасно ли это... т.е:
Цитата

class A
{
  int field1;
};

class B: public A
{
  int field2;
  void f()
  {
  // во-первых, не знаю, какой здесь this будет...
  }
}

typedef void(A::*fptr)();
void run(A *a,fptr fun)
{
  (a->*fun)();
}

int main()
{
  B b;
  run(b,(fptr)&B::f);// во-вторых, здесь явно привести нужно
}

Хотя в wxWidgets сделано по подобному принципу, и вроде как на всех платформах работает...

Если же метод void f() будет виртуальным и объявлен в базовом классе А, то таких неопределенностей не будет.
PM MAIL   Вверх
Riddik
Дата 28.6.2009, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В общем, в сторону указатель на ф-ию, вместо него указатель на базовый класс:
Код

class Base
{
public:
virtual void func()=0;
};

class Just
{
public:
void SetP(Base *pb) {pb->func();}
} just;

class Derived : public Base
{
 public:
void func() {...}
void UseF() {just.SetP(this);}
};


И всё работает. 
Спасибо за терпение.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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