【问题标题】:How do you declare a const array of function pointers?如何声明函数指针的 const 数组?
【发布时间】:2011-01-13 03:01:42
【问题描述】:

首先,我有这样的功能。

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

然后我为数组创建我的 typedef:

void (*FP)();

如果我写一个普通的函数指针数组,它应该是这样的:

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

我想使它成为一个常量数组,在“FP”之前使用 const,但我收到了以下错误消息:

错误:无法将 '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};

我的代码比较庞大复杂,这是一个总结

【问题讨论】:

  • 编写实际代码总是比说“然后我为数组创建我的 typedef:”或“在“FP”之前使用 const”更好。
  • @Facon:你正在使用一个类?你能把整个代码贴在这里吗?
  • 是的,没错。顺便说一句,您使用的是哪个编译器?
  • 别管我了。正如@Prasoon 所注意到的,代码是错误的。而且报错信息也很奇怪。

标签: c++ arrays function-pointers


【解决方案1】:

然后我为数组创建我的 typedef: void (*FP)();

你在void之前错过了typedef吗?

以下适用于我的编译器。

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

 typedef void (*FP)();


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

EDIT

(在看到您的修改后)

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];
 };

【讨论】:

  • 我正在使用一个类...,使用 const FP array[3] = ... 或使用 FP const array[3] = ... 时也会出现同样的错误
  • 呃,你的眼光不错,太棒了!鉴于他的错误消息说void (*)(),我认为自己是静态成员函数,而不是检查它们是否真的是。现在所有的问题是 - 他是否错过了写static,或者他是否打错了typedef或/并且他是否打错了错误消息? xD
  • @Johannes:是的,他在编辑之前的问题有点令人困惑(因为代码没有错误)。 xD :-)
  • 现在我遇到了这个错误:x.cpp:line: error: must use .* or ->* to call pointer-to-member function in 'x::array[((int )((x*)this)->x::number)] (...)' 在另一个 x 类方法中调用数组。你怎么称呼它?
  • @PrasoonSaurav 突出显示从数组中访问函数的方法将完成帖子。
【解决方案2】:

没有typedef:

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

【讨论】:

    【解决方案3】:

    您使用的是哪个编译器?这适用于 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;
    }
    

    【讨论】:

      【解决方案4】:
          typedef void (*FPTR)();
      
      FPTR const fa[] = { f1, f2};
      // fa[1] = f2;  You get compilation error when uncomment this line.
      

      【讨论】:

        【解决方案5】:

        如果您希望数组本身为 const:

        FP const a[] =
            {
                func1,
                func2,
                func3
            };
        

        【讨论】:

        • 无论他写FP const 还是const FP 都没有区别。看到这个问题:stackoverflow.com/questions/1808471/…
        • @ltib:虽然我同意,但我不确定我是否看到您的评论的相关性。也许你只是在观察,在这种情况下,欢呼。
        • 我只是有点困惑,因为你的答案和问题基本相同。只是你的是一个非成员数组(并且你在另一个地方有 const )。所以我没有看到你的答案的相关性。但也许你也只是在观察,所以干杯。
        猜你喜欢
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多