指向私有成员函数的数组

时间:2012-05-01 23:19:43

标签: c++ function-pointers

我正在尝试创建一个指向私有成员函数的指针数组。阵列本身是私有的,所以我不明白它为什么说:

  

错误:'void Foo :: foo1(int)'是私有的

这有效:

class Foo {
    public:
        Foo();
        void foo1(int);
        void foo2(int);

    private:
        void (Foo::*someMethods[])(int);
        void foo3(int);

};

Foo::Foo() {}

void (Foo::*someMethods[])(int) = {&Foo::foo1, &Foo::foo2};

void Foo::foo1(int) {}
void Foo::foo2(int) {}
void Foo::foo3(int) {}

这不起作用:

class Foo {
    public:
        Foo();

    private:
        void (Foo::*someMethods[])(int);
        void foo1(int);
        void foo2(int);
        void foo3(int);

};

Foo::Foo() {}

void (Foo::*someMethods[])(int) = {&Foo::foo1, &Foo::foo2};

void Foo::foo1(int) {}
void Foo::foo2(int) {}
void Foo::foo3(int) {}

1 个答案:

答案 0 :(得分:6)

您的声明

void (Foo::*someMethods[])(int);

在班级Foo

void (Foo::*someMethods[])(int) = {&Foo::foo1, &Foo::foo2};

是完全不相关的数组。后者是一个全局变量。此外,零长度数组在C ++中是非法的,如果你使用gcc,用-pedantic编译它应该给你一个警告。

如果您要访问Foo中声明的数组,您将使用以下内容:

void (Foo::*(Foo::someMethods)[])(int) = {&Foo::foo1, &Foo::foo2};

但是,您只能初始化类外static的成员,因此以下代码可以正常工作:

class Foo {
    public:
        Foo();

    private:
        static void (Foo::*someMethods[])(int);
        void foo3(int);
        void foo1(int);
        void foo2(int);

};

Foo::Foo() {}

void (Foo::*(Foo::someMethods)[])(int) = {&Foo::foo1, &Foo::foo2};

void Foo::foo1(int) {}
void Foo::foo2(int) {}
void Foo::foo3(int) {}

int main(){}

或者您的另一个选择是按照您在评论中所说的那样在构造函数中移动非静态成员。但是,您应该添加要符合的数组大小。