Как я могу использовать этот указатель с указателем на функцию-член

#c #function-pointers #this-pointer

#c #функции-указатели #this-указатель

Вопрос:

У меня есть typedef для указателя на функцию:

 typedef bool(WlanApiWrapper::* (connect_func) )(WLAN_AVAILABLE_NETWORK, const char *, const char *);

  

и есть метод, который возвращает указатель на функцию:

 const auto connect_method = map_algorithm_to_method(*network)
  

Итак, я хочу назвать это так:

 (*this.*connect_method)(*network, ssid, pass);
  

но выдает ошибку:

 Error (active)  E0315   the object has type qualifiers that are not compatible with the member function CppWlanHack C:ProjectsCppWlanHackCppWlanHackWlanApiWrapper.cpp  52  

  

но когда я вызываю это так:

 WlanApiWrapper f;
(f.*connect_method)(*network, ssid, pass);
  

все строится…

Как я могу вызвать метод без создания объекта, потому что у меня уже был объект (этот указатель)

Комментарии:

1. Вы, случайно, не пытались сделать то, что пытаетесь сделать, в методе const? Обратите внимание, что ваш connect_func тип является указателем на неконстантную функцию-член…

2. Когда люди просят вас опубликовать воспроизводимый пример, сделайте это вместо удаления вашего вопроса. Вы можете анализировать числа, разделенные пробелами long.Parse("3 567",NumberStyles.Number, new NumberFormatInfo{NumberGroupSeparator=" "}) . Разделитель может не быть фактическим пробелом, хотя это может быть неразрывный пробел или что-то подобное

Ответ №1:

Сообщение об ошибке звучит для меня так, как будто вы вызываете неконстантный указатель на функцию-член внутри постоянной функции-члена. this является ли a внутри постоянной функции-члена так. const WlanApiWrapper * the object (*this) has type qualifiers (const) that are not compatible with the (non-const) member function

Чтобы решить эту проблему, вы можете либо создать connect_method const, либо создать функцию-член, содержащую (this->*connect_method)(*network, ssid, pass); неконстантную.

Комментарии:

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

Ответ №2:

Назовите это так:

 ((*this).*connect_method)(*network, ssid, pass);
  

Это должно работать со всеми компиляторами.

Для получения дополнительной информации прочитайте, как я могу избежать синтаксических ошибок при вызове функции-члена с использованием функции-указателя на функцию-член?в C FAQ

Комментарии:

1. Унарный * оператор имеет более высокий приоритет, чем .* оператор, так что здесь это не должно быть проблемой. Я согласен, однако, что использование дополнительных круглых скобок сделало бы все это немного более приятным для глаз…

2. Почему бы не использовать this->*connect_method вместо этого?