0
//mediafactory.h

class MediaFactory{
public:
        typedef Media* (*funPointer)();
    funPointer somePointer;
}

//mediafactory.cpp

Media* MediaFactory::returnMedia(){

}

私がやろうとすると

somePointer = returnMedia;

このエラーが発生します:

1   IntelliSense: a value of type "Media *(MediaFactory::*)()" cannot be assigned to an entity of type "MediaFactory::funPointer"   c:\Users\...\mediafactory.cpp   37

ただし、関数を以下のコードに変更すると、コンパイルされて機能します

Media* returnMedia(){   //without scope

}
4

2 に答える 2

3

MediaFactory::returnMedia()非静的メンバー関数であり、 のインスタンスを介してのみ呼び出すことができますMediaFactory

typedef Media* (*funPointer)();オブジェクトなしで呼び出される静的関数または非メンバー関数へのポインターを定義します。したがって、これは別の型であり、メンバー関数へのポインターとは互換性がありません。

メンバー関数を指す必要がない場合は、returnMedia()静的または非メンバーのいずれかを作成します (質問の最後に記載されているように)。

メンバー関数を指す必要がある場合は、メンバーへのポインターが必要です。

typedef Media* (MediaFactory::*funPointer)();

メンバー関数を指すように設定できます。

somePointer = &MediaFactory::returnMedia;

ファクトリ オブジェクトで呼び出すことができます。

Media * media = (someFactory.*somePointer)();

または、ポインターを使用するときではなく、ポインターを設定するときに、関数ポインターをオブジェクトにバインドすることもできます。この場合、任意の呼び出し可能なオブジェクトを格納するためにstd::function(またはboost::function古いコンパイラで立ち往生している場合) を使用できます。

typedef std::function<Media*()> function;
function someFunction;

someFunction = std::bind(&MediaFactory::returnMedia, &someFactory);

Media * media = someFunction();
于 2012-11-16T11:12:34.433 に答える
0

このクラスのインスタンスがなければ、クラスのメソッドをグローバル関数ポインターに割り当てることはできません。

于 2012-11-16T11:05:54.577 に答える