2012-05-01 18 views
2

プライベートメンバー関数へのポインターの配列を作成しようとしています。配列自体はプライベートですので、それは言う私はなぜ表示されない:ポインターからプライベートメンバーへの関数の配列

error: ‘void Foo::foo1(int)’ is private

これは動作します:

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) {} 
+0

'void(Foo :: * someMethods [])= {&Foo :: foo1、&Foo :: foo2};をコンストラクタに追加しました。 – blaze

答えて

6

あなた宣言

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

内部クラスFooおよび

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

は完全に無関係な配列である。後者はグローバル変数です。また、長さ0の配列は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(){} 

また、コメントで述べたように、非スタティックメンバーをコンストラクタ内で移動することもできます。しかし、適合させるために配列のサイズを追加する必要があります。

関連する問題