Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
16 / 16 / 11
Регистрация: 28.10.2016
Сообщений: 75

Непонятность с указателями на функции, наследованием и, мб, шаблонами

11.03.2018, 15:51. Показов 1179. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация следующая:
1) Есть класс costream_base, содержащий следующие строчки:
C++
1
2
3
4
5
protected:
    int(*_MyPrintFn)(const char*, ...);
    int(*_MyPrintlFn)(const char*, _locale_t, ...);
    int(*_MyWPrintFn)(const wchar_t*, ...);
    int(*_MyWPrintlFn)(const wchar_t*, _locale_t ...);
(пробовал заменять на следующее, но результата не дало(см. далее)):
C++
1
2
3
4
5
6
7
8
9
    typedef int(*PrintFN)(const char*, ...);
    typedef int(*PrintlFN)(const char*, _locale_t, ...);
    typedef int(*wPrintFN)(const wchar_t*, ...);
    typedef int(*wPrintlFN)(const wchar_t*, _locale_t, ...);
 
    PrintFN _MyPrintFn;
    PrintlFN _MyPrintlFn;
    wPrintFN _MyWPrintFn;
    wPrintlFN _MyWPrintlFn;
2) Есть класс cofstream_base, содержащий следующие 4 функции:
C++
1
2
3
4
5
protected:
    int _NewPrintFn(const char* _Format, ...);
    int _NewPrintLFn(const char* _Format, _locale_t, ...);
    int _NewWPrintFn(const wchar_t* _Format, ...);
    int _NewWPrintLFn(const wchar_t* _Format, _locale_t, ...);
3) Есть класс costream_t<bool, bool>, публично наследуемый от costream_base
4) Есть класс cofstream_t<bool, bool>, публично наследуемый от cofstream_base и публично наследеумый от costream_t<bool, bool>
5) В классе cofstream_t<> есть функция:
C++
1
2
3
4
5
6
7
8
template<bool a, bool b>
void cofstream_t<a, b>::initFunctions()
{
    _MyPrintFn = &cofstream_base::_NewPrintFn;
    _MyPrintlFn = &cofstream_base::_NewPrintLFn;
    _MyWPrintFn = &cofstream_base::_NewWPrintFn;
    _MyWPrintlFn = &cofstream_base::_NewWPrintLFn;
}
Только оно не работает ;-;
Ошибка C2440 =: невозможно преобразовать "int (__cdecl ksn::cofstream_base::* )(const wchar_t *,...)" в "int (__cdecl *)(const wchar_t *,...)"
Ошибка C2440 =: невозможно преобразовать "int (__cdecl ksn::cofstream_base::* )(const wchar_t *,_locale_t,...)" в "int (__cdecl *)(const wchar_t *,_locale_t,...)"
Ошибка C2440 =: невозможно преобразовать "int (__cdecl ksn::cofstream_base::* )(const char *,_locale_t,...)" в "int (__cdecl *)(const char *,_locale_t,...)"
Ошибка C2440 =: невозможно преобразовать "int (__cdecl ksn::cofstream_base::* )(const char *,...)" в "int (__cdecl *)(const char *,...)"

Я так понимаю, ошибка происходит именно тут: (__cdecl ksn::cofstream_base::* ) -> (__cdecl *) ?
Если да, то как исправить?

Пытался reinterpret_cast'ом - не работает, пытался самописным аналогом - хз, что происходит, но первый аргумент в функцию не передаётся.

P.s. Если нужно могу скинуть весь код
P.s.s. Visual studio 2015, на других компиляторах _locale_t переопределяется с помощью препроцессора
Миниатюры
Непонятность с указателями на функции, наследованием и, мб, шаблонами  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.03.2018, 15:51
Ответы с готовыми решениями:

Задача с шаблонами и наследованием
Ребята, есть такая проблема.. Предположим, что у нас есть класс Image (не шаблонный). И есть класс ImageExt&lt;T1,T2&gt; (шаблонный),...

Первая встреча с шаблонами функции
Доброго времени суток! Пока писал курсач решил попробовать поработать с шаблонами функций, да не тут-то было. Суть такая: хотел на...

Перегрузка функции шаблонами и параметрами по умолчанию
Такая проблема, надо написать header файл и к нему исходник, в которых нужно описать 3 функции и причём каждая функция имеет по несколько...

3
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
11.03.2018, 16:11
У Вас указатели на функции, а Вы хотите влепить в них указатели на функции-члены.
1
16 / 16 / 11
Регистрация: 28.10.2016
Сообщений: 75
11.03.2018, 16:18  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
У Вас указатели на функции, а Вы хотите влепить в них указатели на функции-члены.
Что ж, спасибо за просвящение. Я так понял, преобразовать их нельзя?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
11.03.2018, 16:35
Лучший ответ Сообщение было отмечено Kodirovsshik как решение

Решение

Цитата Сообщение от Kodirovsshik Посмотреть сообщение
Я так понял, преобразовать их нельзя?
Фактически - нет. Они могут быть даже разного размера, не говоря уже о остальном.

Если есть возможность сделать сделать функции-члены статическими, то можно оставить код без изменений.

Можете сделать в базовом классе виртуальные функции и взять на них указатели в наследнике:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Base
{
    typedef int( Base::*MyPrintFn_t)(const char *, ...);//Тип указателя на функцию-член
    
    virtual int _NewPrintFn(const char *, ...) = 0;//Целевая чисто-виртуальная функция
    
    MyPrintFn_t m_Fn;//Сам указатель на функцию-член
};
 
struct Derived: Base
{
    Derived() 
    {
        m_Fn = &Base::_NewPrintFn;//Нацеливаем указатель на виртуальную функцию
    }
    int _NewPrintFn(const char *, ...) override //Конечная функция
    {
        return 0;
    }
    
};

А может Вам достаточно просто виртуальных функций?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2018, 16:35
Помогаю со студенческими работами здесь

С++ - map с указателями на функции и функции в классе
Сразу скажу, не уверен, что это возможно осуществить моим способом и прошу указать мою ошибку или показать другое решение близкое к моему.....

При одном вызове функции осуществлять поиск и замену, пользуясь сразу несколькими шаблонами
Написать программу, которая из строки $str=&quot;&lt;html&gt; &lt;head&gt; &lt;title&gt;Test&lt;/title&gt; &lt;/head&gt; ...

Функции с указателями
Прокомментируйте листинг программы int f(int a, int *b, int &amp;c){ return(++a + ++(*b) + c++); итерация а, b, c и их конкатенация ...

Передача параметров функции указателями
Вычислить и запомнить количество отрицательных элементов каждого столбика для матриц а(10,10); b(15,20). Использовать функции для ввода...

Вызов функции с указателями на матрицу
Добрый вечер! Как правильно вызвать такую функцию: bool matr_invert(double **matrix, double **result, int size) { ... } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru