Не удается вызвать указатель функции структуры на метод класса

используйте С++98. У меня есть структура t_fd, которая используется внутри класса MS. В структуре есть два указателя на функцию: fct_read, fct_write. Я разработал так, чтобы указатели функций указывали на два метода класса. Но тогда у меня есть эта ошибка при попытке вызвать им.

expression preceding parentheses of apparent call must have (pointer-to-) function type.

Прошу совета по ошибке, а также по дизайну. Мне нужно, чтобы две функции были методами этого класса, потому что мне нужно использовать атрибуты класса (хотя это не показано здесь для простоты). Спасибо за ваше время, я ценю вашу помощь!

#include <vector>
#include <iostream>

typedef struct  s_fd {
    void(MS::*fct_read) (int);
    void(MS::*fct_write) (int);
}   t_fd;

class MS
{
    private:
        std::vector< t_fd >            _fdSet;

        void        server_accept(int s)
        {
            if (s % 2 == 0)
                _fdSet[cs].fct_read = MS::client_read;
            else
                _fdSet[cs].fct_write = MS::client_write;
        }

        void        client_read(int fd)
        {
            std::cout << "I'm reading\n";
        }

        void        client_write(int fd)
        {
            std::cout << "I'm writing\n";
        }

        void        check_fd()
        {
            int i = 0;
            int size = 10;

            while (i < size)
            {
                if (i < 5)
                    _fdSet[i].fct_read(i); //Error here!
                if (i >= 5)
                    _fdSet[i].fct_write(i); //Error here!
                i++;
            }
        }
};

Re: «Я использую C++98» — почему?

Pete Becker 16.05.2022 22:27

связанные/обман: stackoverflow.com/questions/66800751/…

NathanOliver 16.05.2022 22:27

В начале server_acceptint cs; оставляет cs с неопределенным значением. Код, который следует за этой строкой, использует это значение, поэтому код не будет делать ничего значимого.

Pete Becker 16.05.2022 22:30

Поскольку все внутри MS является приватным, никакой другой код ничего не может с этим сделать.

Pete Becker 16.05.2022 22:32

Синтаксис для вызова функции-указателя-члена использует .* или ->*; звонки как написано просто не могут работать. Мне в голову не приходит (this->*_fdSet[I].fct_read)(i); способ сделать это.

Pete Becker 16.05.2022 22:35
std::vector<t_fd> _fdSet; создает вектор без элементов. Присвоение чего-либо _fsSet[cs] приводит к неопределенному поведению, потому что такого элемента нет. Когда вы добавляете к пустому вектору, используйте push_back.
Pete Becker 16.05.2022 22:37

@PeteBecker: Спасибо за ваши комментарии. Теперь это работает. Я также прочитал ссылку, это действительно полезно. - Для КС ты прав. Я отредактировал код, чтобы он был осмысленным. - Для вектора _fdSet я добавлял элементы с помощью push_back, но здесь это не показано. - Мне нужно, чтобы все было в привате и вроде бы без проблем. Но я слежу за этим, если когда-нибудь столкнусь с проблемой в будущем. - C++98, потому что я должен (школьный проект).

Snow_Ball 16.05.2022 22:46

@PeteBecker: теперь у меня есть эта ошибка: cannot convert ‘MS::client_read’ from type ‘void (MS::)(int)’ to type ‘void (MS::*)(int)’ в функции server_accept. Ты знаешь почему?

Snow_Ball 16.05.2022 23:09

Правильный синтаксис для создания указателя на функцию-член: &MS::client_read. У вас есть хорошая книга, по которой можно поучиться?

Pete Becker 16.05.2022 23:18
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
9
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Цель вашего кода трудно понять (в его нынешнем виде). Но я был бы рад решить несколько проблем в вашем коде.

  1. Класс MS должен быть объявлен до того, как вы сошлетесь на тип из определения структуры s_fd:
class MS; // forward declaration
    
typedef struct  s_fd {
void(MS::* fct_read) (int);
void(MS::* fct_write) (int);
}   t_fd;
    
class MS
{  ... }
  1. синтаксис для назначения указателя функции неверен. Ты забыл &:
_fdSet[cs].fct_read = &MS::client_read;
  1. fct_read и fct_write являются указателями на функции-члены. Они должны применяться к экземпляру класса MS. Если вы хотите применить их к объекту это:
if (i < 5) {
  auto fptr = _fdSet[i].fct_read;
  (this->*fptr)(i);
}

Другие вопросы по теме

Похожие вопросы

Как работает параметр приблизительноPolyDP и эпсилон?
Как вставить запись в Microsoft Access с помощью MFC?
Включение предварительно скомпилированного заголовка и непредварительно скомпилированного заголовка в файл .cpp приводит к тому, что файл .cpp не распознает непредварительно скомпилированный заголовок.
Привязка rvalue ref к строковому литералу в конструкторе по сравнению с построением на месте
ROOT (CERN): постройте фигуру с планками погрешностей, используя данные из файла csv.
Требуется позиционирование предложения в шаблонах функций C++20.
Как я могу показать блок комментариев внутри блока кода внутри блока doxygen?
Инициализация параметризованного массива вложенных структур C++
Как определить функцию-член специализированного класса шаблона?
Будет ли std::unordered_map::clear() медленнее, чем std::map::clear(), потому что операции очистки «выполняются» в первом?