1

herehereをたくさん読んだ後でも、コードを機能させることができません。問題は次のとおりです。

Fifo という 2 つのクラスがあります。

#ifdef __cplusplus
 extern "C" {
 #endif 

class Fifo
{
public:

   Fifo(int len);
   ~Fifo();

   void  AddTokens(void* buffer, unsigned len);

private:

   // some variables here

};

#ifdef __cplusplus
 }
 #endif 

および別のクラス Process_Wrapper:

#ifdef __cplusplus
 extern "C" {
 #endif 


class Process_Wrapper
{
    public:
        Process_Wrapper(const std::string process_name);
        Fifo* GetOutputPortIDtoFifoMap(int portID);
        virtual ~Process_Wrapper();
    protected:
private:
    //some variables here
};

#ifdef __cplusplus
 }
 #endif 

メンバー関数Process_Wrapper::GetOutputPortIDtoFifoMapは、 class の初期化されたオブジェクトへのポインターを返しますFifo

Fifoこれで、クラスのヘッダーでコンパイルされてインクルードされた共有オブジェクト (.so) ができProcess_Wrapperました。つまり、.so ファイルはこれらのクラスへのインターフェイスを認識します。

Process_Wrapperこの .so ファイルを( )のメンバ関数から呼び出し、Process_Wrapper::function2.so にポインタ - を渡しますthis。したがって、共有オブジェクトはクラスに関するすべてを知っていると思いますProcess_Wrapper

.so ファイルで、メンバー関数を呼び出そうとしていますがProcess_Wrapper::GetOutputPortIDtoFifoMap、明らかに機能しません。だから、私は試しました:

Fifo* (Process_Wrapper::*GetFifoMapping)(int) = p1->wptr->GetOutputPortIDtoFifoMap; 

whereはオブジェクトp1->wptrへのポインターをProcess_Wrapper正しく返します。

私はここで迷っています。私はこの概念にまったく慣れていないため、例は質問に直接答えていません。どうすればそれを行うことができますか?

また、私は C++0x/C++11 を使用しているので、std::bind または mem__fun_ref を使用した解決策を (できれば) 教えてもらえますか?

編集:わかりました、質問を絞り込むことができると思います: classと、このクラスのインスタンスであるMyclassobjectがあります。にはメンバー関数があり、いくつかの引数を取り、タイプ のポインターを返します。通常の関数へのポインターとして使用できるように、別の関数に渡されるメンバー関数を抽出するにはどうすればよいですか。または、具体的には、メンバー関数へのバインドされたポインターから関数ポインターを抽出するにはどうすればよいですか?myobjectMyclassPTRTYPEMyclass

4

1 に答える 1

1

私自身の質問に答えるために、「this」ポインターを .so オブジェクトに渡していました。ただし、実行時に、シンボルが見つからないというエラーが発生しました。このシンボルは、.so ファイルでは「U」またはマップされていませんでしたが、この .so をロードするメイン exe (「T」) で定義されていました。私がしなければならなかったのは、メインの exe を生成するリンカー オプションに「-rdynamic」を追加することだけでした。

明らかに、問題がそれほど単純であるとは思いませんでした。私の (間違った) 仮説は、問題は初期化されたオブジェクトのメンバー関数へのポインターを正しく使用することに関連しているというものでした。

私が投稿した問題の説明が明確でない可能性があることを理解しており、そのことをお詫び申し上げます。

みんな、ありがとう。

于 2012-01-04T13:00:02.720 に答える