2010-11-30 39 views
0

メンバ関数の関数ポインタを別のクラスに渡す必要があります。私はそれをコンパイルすることができませんでしたし、私は "classB :: classB(classA :: *)(std :: shared_ptr)"への未定義の参照を取得します。誰かがこれで私を助けることができますか?メンバ関数を関数ポインタに渡す

ありがとうございました。

classA{ 
    string functionA(share_ptr<int>); 
    void functionB(){ 
    classB* ptr = new classB(&classA::functionA); 
    } 
} 

//in other .h file 
classA; //forward declaration 

classB{ 
    classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor 
} 
+0

私はそれが正しい構文であることが判明...それを持っている..私は再びそれをコンパイルする前に、いくつかの古いファイルをきれいにしていないだけということです。..その上で私の時間を無駄に... – Steveng

+0

一つのことは、あなたのコンストラクタです閉じ括弧がありません。また、ヘッダーにclassBのコンストラクターの実装が表示されないため、.cppファイルを投稿した場合にも役立ちます。 – Will

+0

-1質問に不正確かつ不完全な情報があります。コードは実際のコードではありません。コンパイルすべきではありません。提示されたコードは、あなたのリンクエラーが何をもたらすのかを言うのに十分なものではありません。 –

答えて

0

、あなたはそれがあなたのためにコンパイルされたにもかかわらず、これに答えるために行きます...

// In a.hpp 
#include "b.hpp" // you need to include this because you will not 
       // be able to call B's constructor in your functionB() method 

class A 
{ 
public: 
    string functionA (shared_ptr<int>); // IIRC, needs to be public to call it 
             // from B's constructor. 

    // can be public/protected/private depending on where it's called ... 
    void functionB() { 
    B * ptrB = new B (&A::functionA); 
    } 
}; 

// In b.hpp 

// Forward declare class A 
class A; 
// To make the constructor of B cleaner, use a typedef. 
typedef string (A::*IntPtrToStrFn) (shared_ptr<int>); 

class B 
{ 
public: 
    B (IntPtrToStrFn fnptr); 
}; 

限りスタイルとコードの可読性が行くように、これは恐ろしいです - 一緒にネクタイ二つのクラスとコードのにおいのreaks。 2つのクラスを連携させるには、何らかの種類のアダプタクラスやその他のデザインパターンを調べる必要があります。

0

表面上、これは前方宣言の問題のように見えます。完了したようにclassA::functionBを宣言してから、classBの定義の後にclassA::functionBを定義してみてください。私はこれを書いているよう

2

あなたのコード:ここで

classA{ 
    string functionA(share_ptr<int>); 
    void functionB(){ 
    classB* ptr = new classB(&classA::functionA); 
    } 
} 

は:

  • share_ptrshared_ptrでなければなりません。

  • クラス定義の最後にセミコロンがありません。その後

、ここで

//in other .h file 
classA; //forward declaration 

classB{ 
    classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor 
} 

  • 3つの左括弧( 2つだけ右括弧)があります。

  • クラス定義の最後にセミコロンがありません。

あなたはリンクエラーについて質問していますが、あなたのコードはコンパイルすべきではありません。

「コンパイルすることができませんでした」と書かれている場合は正しいと思われます。

「私は[未定義の参照を取得しました...]」と書かれていますが、これは謎です。明らかに使用しているツールチェーンでは、コンパイルが失敗したときにリンカーを呼び出すべきではありません。

要約すると、この質問にはいくつかの間違った情報と回答が含まれています(関数を定義していないという仮説や、どこかに定義したがリンクしていないという仮説、あなたのコード以外のものを作ることからのエラーを報告するなど)は純粋な推測です。

リンクエラーをコンパイルして示す完全な小さなプログラムを投稿してください。

乾杯& HTH。、ちょうどくすくす笑いのため

関連する問題