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

Проинциализировать и использовать массив указателей на функции

14.07.2016, 22:45. Показов 1205. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь проинциализировать и использовать массив указателей на функции. Компилятор упорно выдает ошибку, даже если следовать многочисленным примерам в интернете и книгах:

myclass.h
C++
1
2
3
4
5
    void a();
    void b();
    void c();
    void (*funPtrsArray[3])() = {a, b, c};//ошибка "a brace-enclosed initializer is not allowed here before '{' token"
                      //ISO C++ forbids initialization of member 'funPtrsArray'
Хорошо, может в заголовочном файле нельзя его проинициализировать, пробую так:
myclass.h
C++
1
2
3
4
    void a();
    void b();
    void c();
    void (*funPtrsArray[3])();
myclass.cpp
C++
1
funPtrsArray = { a, b, c};//ошибка: incompatible types in assignment of '<brace-enclosed initializer list>' to 'void (* [0])()'
Как сделать правильно? И единственный ли это способ инициализации массива указателей на функции - присвоение и объявление в одной строке? СПасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2016, 22:45
Ответы с готовыми решениями:

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Зачем нужен массив указателей на функцию и как его использовать?
народ подскажите пожалуйста, зачем нужен массив указателей на функцию и как его использовать.

Создать массив указателей на Person и использовать его со всеми производными классами
Всем привет, это моя первая тема на форуме, поэтому сорри, если что не так. В местном поиске...

Различные функции, для которых можно создать массив указателей на функции
Придумайте не менее 3-х различных функций, для которых можно создать массив указателей на функции.

10
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.07.2016, 22:54 2
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Как сделать правильно?
Для начала нужно показать чуть больше кода, чтобы было видно задумку и контекст.
Судя по ошибкам, там есть еще какой-то код, который важен, чтобы составить правильное решение твоей проблемы.
1
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
14.07.2016, 22:57 3
У тебя вообще не работает или только если в h-файле?
Второй вариант надо поэлементно присваивать.
1
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
14.07.2016, 23:03  [ТС] 4
Цитата Сообщение от DrOffset Посмотреть сообщение
Для начала нужно показать чуть больше кода
Кода больше нет) разве что тела методов в .cpp файле:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
void myclass::a()
{
    qDebug()<<" from function a";
}
void myclass::b()
{
    qDebug()<<" from function b";
}
void myclass::c()
{
    qDebug()<<" from function c";
}
0
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
14.07.2016, 23:08 5
ctakah3112, ваш первый вариант у меня работает.
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
14.07.2016, 23:10  [ТС] 6
Цитата Сообщение от nmcf Посмотреть сообщение
У тебя вообще не работает или только если в h-файле?
Никак не работает
Цитата Сообщение от nmcf Посмотреть сообщение
Второй вариант надо поэлементно присваивать
myclass.h
C++
1
void (*funPtrsArray[3])();//объявил. Не ругается
myclass.cpp: (пробую присвоить)
C++
1
funPtrsArray[0] = &a;//ошибка: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.
Видимо, поэлементно присваивая, можно проинициализировать только адресами статических функций. По-другому никак?

Добавлено через 1 минуту
Цитата Сообщение от HenryDukart Посмотреть сообщение
ваш первый вариант у меня работает
Ничего себе. Неужто глюк компилятора?
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.07.2016, 23:14 7
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Кода больше нет)
Все всегда так сопротивляются, когда просят больше кода, как будто последнюю рубаху отдать предлагают
Покажи уже как выглядит твой заголовочный файл.

В любом случае, если a, b, c - это функции-члены, то типа для массива ты выбрал неправильный.
Если funPtrsArray - это член класса, то опять же, инициализация в объявлении класса доступна только с С++11. В некоторых компилятор ее необходимо включить.
Если второй способ - это попытка инициализации в конструкторе, то она опять же не верна, т.к. массивы не поддерживают присваивание.

Видишь сколько вопросов? И это еще не все. Так что давай полный код - это в твоих интересах, если хочешь, чтобы тебе качественно помогли. Не заставляй применять телепатию, на всех ее не напасешься

Добавлено через 57 секунд
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Неужто глюк компилятора?
Ни в коем случае.

Добавлено через 2 минуты
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Видимо, поэлементно присваивая, можно проинициализировать только адресами статических функций. По-другому никак?
Тип массива для функций членов должен быть другим.

Код для С++11 и выше (Инициализация массива указателей на функции-члены):
C++
1
2
3
4
5
6
7
8
9
class A
{
public:
    void a();
    void b();
    void c();
    
    void (A::*funPtrsArray[3])() = {&A::a, &A::b, &A::c};
};
0
Заблокирован
14.07.2016, 23:16 8
ctakah3112, при объявлении нужно было не указывать размер массива, так всё соберётся
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
void a(){cout<<"a"<<endl;}
void b(){cout<<"b"<<endl;}
void c(){cout<<"c"<<endl;}
void (*funPtrsArray[])() = {a, b, c};//ошибка "a brace-enclosed initializer is not allowed here before '{' token"
                      //ISO C++ forbids initialization of member 'funPtrsArray'
 
int main(){
    funPtrsArray[1]();
    return 0;
}
http://codepad.org/o2FHd2eM
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
14.07.2016, 23:20  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Так что давай полный код
Хорошо)
Dialog.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include <QDebug>
 
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    
private:
    Ui::Dialog *ui;
    void a();
    void b();
    void c();
    void (*funPtrsArray[3])() = {a, b, c};
};
 
#endif // DIALOG_H
Dialog.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::a()
{
    qDebug()<<" from function a";
}
void Dialog::b()
{
    qDebug()<<" from function b";
}
void Dialog::c()
{
    qDebug()<<" from function c";
}


Добавлено через 1 минуту
Цитата Сообщение от Unknownx Посмотреть сообщение
при объявлении нужно было не указывать размер массива, так всё соберётся
Не помогло
0
Заблокирован
14.07.2016, 23:23 10
Для класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
class ctest{
    
public:
static void a(){cout<<"a"<<endl;}
static void b(){cout<<"b"<<endl;}
static void c(){cout<<"c"<<endl;}
static void (*funPtrsArray[3])(); 
};
 
void (*ctest::funPtrsArray[3])() = {ctest::a, ctest::b, ctest::c};
 
int main(){
    ctest::funPtrsArray[1]();
    return 0;
}
http://codepad.org/NQ5hPWbj

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ctakah3112 Посмотреть сообщение
void (*funPtrsArray[3])() = {a, b, c};
- ну где такое в теле класса видел, омг

0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.07.2016, 23:23 11
ctakah3112,

Будет работать в С++11 (в MinGW нужно включать опцией -std=c++11, в pro файле Qt5 CONFIG += C++11, в Qt4 - QMAKE_CXXFLAGS += -std=c++11):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    
private:
    Ui::Dialog *ui;
    void a();
    void b();
    void c();
    void (Dialog::*funPtrsArray[3])() = { &Dialog::a, &Dialog::b, &Dialog::c };
};
Если компилятор без поддержки С++11, то в конструкторе делаем так:
C++
1
2
3
4
5
6
7
8
9
10
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    funPtrsArray[0] = &Dialog::a;
    funPtrsArray[1] = &Dialog::b;
    funPtrsArray[2] = &Dialog::c;
}
Массив соответственно объявляется так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    
private:
    Ui::Dialog *ui;
    void a();
    void b();
    void c();
    void (Dialog::*funPtrsArray[3])();
};
0
14.07.2016, 23:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2016, 23:23
Помогаю со студенческими работами здесь

Объявить массив из N указателей на функции, возвращающих указатели на функции, возвращающие указатель на char
Задание: Объявить массив из N указателей на функции, возвращающих указатели на функции,...

Массив указателей на функции
Добрый день! Разбираюсь в предмете. общая суть ясна, но не понятен следующий момент: Если у...

Массив указателей на функции
Здравствуйте! Подскажите пожалуйста, где ошибка в программе. Не могу разобраться с массивом...

Массив указателей на функции
Как правильно создать массив? С простыми функциями, где не больше двух параметров, все...

Массив указателей на функции
Скажите пожалуйста - поддерживает или нет Arduino IDE массив указателей на функции (раньше работал...

Массив указателей на функции
Здравствуйте! Задача: Реализовать три функции, каждая из которых принимает вещественное число и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru