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

または、他のオプションは、コメントで述べたように、コンストラクターで非静的メンバーを移動することです。ただし、準拠する配列のサイズを追加する必要があります。

于 2012-05-02T00:14:53.093 に答える