2016-04-13 12 views
-1

ここでこの問題を発見しましたが、これを拡張したいと思います。私は一つのファイルに次のクラスを持っているし、それが正常に動作します:関数がクラス内の関数へのポインタを返すようにする(C++)

typedef int (*fptr)(); 

int f1() { 
    return 1; 
} 

int f2() { 
    return 2; 
} 




fptr f(char c) { 
    if (c == '1') { 
     return f1; 
    } 
    else { 
     return f2; 
    } 
} 

しかし、私は別のファイル内の関数を移動し、それらのうちの工場を作りたいとき、私は理解できないエラーが発生します。

それはこのようになります:

ヘッダー:

public class Factories{ 
    public: 
    int f1(); 
    int f2(); 
} 

CPPFILE:

int f1() { 
    return 1; 
} 

int f2() { 
    return 2; 
} 

ヘッダー:

public class FactoryClass{ 
    public: 
    fptr f(char c); 
} 

CPPFILE:

typedef int (*fptr)(); 
fptr f(char c) { 
    if (c == '1') { 
     return Factories::f1; 
    } 
    else { 
     return Factories::f2; 
    } 
} 

ここで、このFactoryClass関数が返されると、「戻り値の型が関数の型と一致しません」というエラーが表示されます。 アイデアをいただければ幸いです。

+0

C++では、単純に関数ポインタを必要としない純粋仮想関数をオーバーロードすることができます。 – SPlatten

+0

typedef int(* fptr)(); ** typedef int(Factories :: * fptr)(); ** –

答えて

2

Factories::f1である必要があり、それはメンバ関数で、通常の関数ではありません。それはメンバ関数なので、呼び出されたオブジェクトへのポインタを取る必要があり、そのインスタンスに影響を与えることができます。これは、メンバ関数の型は、それが呼び出されたオブジェクトの種類を含んでいるので、f1へのポインタは、実際にあなたがfptr

typedef int (Factories::*fptr)(); 

またはメイク加える必要がありますどちらかのタイプ

int (Factories::*)() 

を有することを意味します機能staticは通常の機能のように動作します。

+0

または、それらをクラスに保持しますが、静的にします。 –

+0

@ MarvinSielenkemper私は最後の文章でそれを言った。 – NathanOliver

+0

ああ、申し訳ありません!これは別の答えを意味していました。 –

1

戻ってきたメンバー関数Facotires :: f1の署名が間違っています。可能であれば、それら(f1とf2)を静的にします。そうでない場合は、それぞれのクラスインスタンスをバインドします(boost :: bindまたはstd :: bindを使用)。

関連する問題