【问题标题】:Pointer-to-private-member-function array指向私有成员函数数组的指针
【发布时间】:2012-05-11 10:51:43
【问题描述】:

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

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

【问题讨论】:

  • 所以,我在构造函数中添加了:void (Foo::*someMethods[])(int) = {&Foo::foo1, &Foo::foo2};,它现在可以工作了。

标签: c++ function-pointers


【解决方案1】:

你的声明

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

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

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多