3

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

错误:'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) {}
4

1 回答 1

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(){}

Or your other option is to move the non-static member in the constructor as you said in the comments. But, you should add the size of the array to be conforming.

于 2012-05-02T00:14:53.093 回答