2011-05-19 18 views
0

オブジェクト上の別のクラスのメンバ関数を呼び出すが、これはどのように動作するのかわからない。それがどのように動作するかを上のコード例として:私はこれがローミングサービスを作る願っていC++でのクラスメンバ関数ポインタ

Class A { 
    void somefunction(int x); 
} 

Class B : A { 
    void someotherfunction(int x); 
} 

Class C { 
    void x() { 
     callY(&ofthefunction); 
} //here you call the function, you dont have an object yet, and you don't know the argument yet, this will be found in function callY 

    void Y(*thefunction) { 
     find int x; 
     if(something) 
      A a = find a; 
      a->thefunction(x); 
     else 
      B b = find b; 
      b->thefunction(x); 
} 
} 

、2つの方法、Y1とY2でこれを分割することも可能であるが、コードの90%が同じであると見て(発見しますXMLファイル内のもの)は、オブジェクトとそれを保存する引数だけが異なるので、私はこれをしたいと思います

+1

?いいえ、それはありません。 atleast compilableコードを投稿してください。あなたのコードがコンパイルされていなくても、非常に多くの構文エラーがあるのならば、C++に関するあなたの知識についてはどうしたらいいでしょうか? – Nawaz

答えて

2

仮想関数として知られているものを使用することができます。ところで、あなたの文法は恐ろしいです。classClassではありません。あなたの条件には括弧が必要です。publicの賢明なアプリケーション、いくつかの余分なセミコロンなどが必要です。ここに来る前にコンパイラに近づけば、y '知っている。

class A { 
public: 
    virtual void somefunction(int x); 
}; 

class B : public A { 
public: 
    virtual void somefunction(int x); 
}; 

void func(A& a) { 
    int x = 0; 
    // Do something to find x 
    a.somefunction(x); 
    // calls A::somefunction if this refers to an A 
    // or B::somefunction if it's a B 
} 
int main() { 
    A a; 
    func(a); // calls A::somefunction 
    B b; 
    func(b); // calls B::somefunction 
} 
+0

申し訳ありませんが、実際のC++コードではなく、疑似コードを記述しようとしていましたか?たぶん私はそれを複雑すぎるようにしようとしています、事は私が学校ではC++ではなくCのレッスンしか持っていないので、私はおそらくC言語でそれをやるつもりです。 これは私の問題を解決することはできませんあなたの例でクラスAとして実際に2つの実質的に同じ機能を持っているtruefunctionとfalsefunction、問題が発生した場合、私は実際にfuncで名前を指定する代わりに、 A&A)それは解決されるだろう。 –

0

いいえ、それはまったく機能しません。 Aのメンバーへのポインタは、BがBを継承しているためBで呼び出されても、常にその関数を指します。

仮想関数を使用する必要があります。私はDeadMGが私にそれを殴ったのを見る。

1

あなたは、私はそれをこのように解決woudn'tが、行うことができます何をしたいか:

class A { 
public: 
    virtual int doit(int x) { return x+1; } 
}; 

class B : public A { 
public: 
    int doit2(int x) { return x*3; } 
    int doit(int x) { return x*2; } 
}; 

int foo(int (A::*func)(int), int x, bool usea) { 
    if (usea) { 
     A a; 
     return (a.*func)(x); 
    } else { 
     B b; 
     return (b.*func)(x); 
    } 
} 

int main() { 
    int (A::*bla)(int) = &A::doit; 
    foo(bla, 3, true); 
    foo(bla, 3, false); 

} 

しかし、これが機能するために、以下を満足する必要があります。

  1. 基本クラス(たとえばint (A::*bla)(int))の関数ポインタを使用する必要があります。そうしないと、基本クラスでは呼び出せません(int (B::*bla)(int)Bインスタンスでのみ使用でき、Aインスタンスでは使用できません。メソッドは既にAで定義されています)。
  2. メソッドは基本クラスと同じ名前でなければなりません
  3. オーバーライド(派生クラスの異なるimplなど)を使用するには、virtual関数を使用する必要があります。あなたはそれが理にかなって願っています

しかし、私はむしろ、あなたのデザインを再考でしょう...

+0

いいクリーンなコードが動作します。私はそれをコーディングしようとしていませんが、C++のテンプレートは私にとって正しいアプローチのようです。 – hackworks

+0

私のデザインの見直しについて:私はオプションとして3つのメンバ関数しか持たないので、if else else ifを持つようにすることは可能でしょう(ただし、クラスAには1クラスBには2つの他の名前がありますが、同様の結果が得られます)。しかし、私が求めているようにできるのであれば、私はちょうど好奇心を持っていました。 –