指向私有成员函数的数组

bla*_*aze 3 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) {}
Run Code Online (Sandbox Code Playgroud)

这不起作用:

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) {}
Run Code Online (Sandbox Code Playgroud)

Jes*_*ood 6

你的声明

void (Foo::*someMethods[])(int);
Run Code Online (Sandbox Code Playgroud)

内部课堂Foo

void (Foo::*someMethods[])(int) = {&Foo::foo1, &Foo::foo2};
Run Code Online (Sandbox Code Playgroud)

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

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

void (Foo::*(Foo::someMethods)[])(int) = {&Foo::foo1, &Foo::foo2};
Run Code Online (Sandbox Code Playgroud)

但是,您只能初始化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(){}
Run Code Online (Sandbox Code Playgroud)

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