Как се декларира const масив от функционални указатели?

Първо, имам функции като тази.

void func1();
void func2();
void func3();

След това създавам моя typedef за масива:

void (*FP)();

Ако напиша нормален масив от указатели на функции, той трябва да бъде нещо подобно:

FP array[3] = {&func1, &func2, &func3};

Искам да го направя постоянен масив, използвайки const преди "FP", но получавам следните съобщения за грешка:

грешка: не може да преобразува 'void ( * )()' в 'void ( * const)()' инициализация

PD: Съжалявам за лошия ми английски.

РЕДАКТИРАНЕ:

x.h

typedef void (*FP)();

class x
{
 private:
  int number;
  void func1();
  void func2();
  void func3();
  static const FP array[3];
}

x.cpp

const FP x::array[3] = {&x::func1, &x::func2, &x::func3};

Моят код е по-голям и сложен, това е обобщение


person Facon    schedule 04.02.2010    source източник
comment
Винаги е по-добре да напиша действителния код, отколкото да кажа Тогава създавам моя typedef за масива: или използвайки const преди FP.   -  person sand    schedule 04.02.2010
comment
@Facon: Използвате клас? Можете ли да публикувате целия код тук?   -  person Jagannath    schedule 04.02.2010
comment
Да, правилно е. BTW, кой компилатор използвате?   -  person Jagannath    schedule 04.02.2010
comment
Не ми обръщайте внимание. Както забеляза @Prasoon, кодът е грешен. И съобщението за грешка също е странно.   -  person Johannes Schaub - litb    schedule 04.02.2010


Отговори (4)


След това създавам моя typedef за масива: void (*FP)();

Липсваше ли ви typedef преди void?

Следното работи върху моя компилатор.

 void func1(){}
 void func2(){}
 void func3(){}

 typedef void (*FP)();


 int main()
 {
     const FP ar[3]= {&func1, &func2, &func3};
 }

РЕДАКТИРАНЕ

(after seeing your edits)

x.h

 class x;
 typedef void (x::*FP)(); // you made a mistake here

 class x
 {
   public:
      void func1();
      void func2();
      void func3();
      static const FP array[3];
 };
person Prasoon Saurav    schedule 04.02.2010
comment
Използвах клас..., получавам същата грешка, използвайки const FP array[3] = ... или използвайки FP const array[3] = ... - person Facon; 04.02.2010
comment
Ух, имаш добро око, страхотно! Като се има предвид, че съобщението му за грешка казваше void (*)(), аз си мислех за статични членски функции, без да проверявам дали наистина са. Сега целият въпрос е - дали е пропуснал да напише static, или е сбъркал typedef или/и е сбъркал съобщението за грешка? xD - person Johannes Schaub - litb; 04.02.2010
comment
@Johannes: Да, въпросът му преди редакциите беше малко объркващ (защото кодът нямаше грешки). xD :-) - person Prasoon Saurav; 04.02.2010
comment
Сега имам тази грешка: x.cpp:line: грешка: трябва да използвам .* или -›* за извикване на функцията указател към член в 'x::array[((int)((x*)this) -›x::число)] (...)' Извикване на масива в друг метод от x клас. как го наричаш - person Facon; 05.02.2010
comment
@PrasoonSaurav Открояването на метода за достъп до функция от масива ще завърши публикацията. - person madD7; 02.02.2016

без typedef:

void (*const fp[])() = {
    f1,
    f2,
    f3,
};
person vlk    schedule 15.12.2014

Кой компилатор използвате? Това работи на VS2005.

#include <iostream>

void func1() {std::cout << "func1" << std::endl;}
void func2() {std::cout << "func2" << std::endl;}
void func3() {std::cout << "func3" << std::endl;}

int main()
{
int ret = 0;

typedef void (*FP)();

const FP array[3] = {&func1, &func2, &func3};

return ret;
}
person sand    schedule 04.02.2010

Ако искате самият масив да бъде const:

FP const a[] =
    {
        func1,
        func2,
        func3
    };
person John Dibling    schedule 04.02.2010
comment
Дали пише FP const или const FP няма значение. Вижте този въпрос: stackoverflow.com /questions/1808471/ - person Johannes Schaub - litb; 04.02.2010
comment
@ltib: Въпреки че съм съгласен, не съм сигурен, че виждам уместността на вашия коментар. Може би просто наблюдавате, в който случай, наздраве. - person John Dibling; 04.02.2010
comment
Просто бях малко объркан, тъй като вашият отговор и въпросът са по принцип идентични. Само че вашият е масив, който не е член (и че имате const на друго място). Така че не виждам уместността на вашия отговор. Но може би и вие просто наблюдавате същото, така че наздраве. - person Johannes Schaub - litb; 07.02.2010