2011-10-29 9 views
0

私は仮想基底クラスから降りてくる別のクラスの子孫である関数を持っています。クラス自体に蓄積されたファンクタへの参照を渡します

その中にはファンクタがあります。ファンクタは、この関数およびその親クラスの内部のすべてのオブジェクトにアクセスできる必要があります。しかし、 "this"または関数名への参照を渡すときにエラーが発生します。

このすべての複雑さの理由は、コードをスピードアップするためです。私が実際にコーディングしているアルゴリズムは、1つの高価な部分しか持っていません。私の意図は、その部分を並列化することです。しかし、このステップは、いくつかのステップを経て同時に2つの値に累積されます。だから、私はいくつかの演算子をオーバーライドする必要があります。ファンクタはこれを実装する最も簡単な方法のように思えました。

ファンクタは、myClassAおよびmyClassB内のオブジェクトにアクセスできる必要があるため、myClassBへの参照を使用して構築する必要があります。 (BはAから降りるので、すべてがアクセス可能でなければなりません)

問題は、ファンクタを蓄積線に渡そうとすると、一致する関数がないというエラーが発生することです。私は "this"、 "* this"、 "myClassA"、 "myClassB"などを試しました。

アイデアは何ですか?

class myBaseClass { 
public: 
    virtual double doFancyStuff(double a, double b)=0; 
    virtual double doOtherFancyStuff(double a, double b)=0; 
} 

class myClassA : public myBaseClass { // B inherits a bunch of stuff from myClassA 
    public: 
     double doFancyStuff(double a, double b){ 
      double C = pow(a,b); //dummy action, is actually a lot of fancy math here 
      return C; 
     } 
     virtual double doOtherFancyStuff(double a, double b)=0;  
} 

class myClassB : public myClassA { // B inherits a bunch of stuff from myClassA 
    public: 
     double doOtherFancyStuff(double a, double b){ 
      return pow(a * b, 3); //dummy action, is actually a lot of fancy math here 
     } 

    double doMoreFancyStuff(double a, double b){ 
     // do some stuff 

     struct MyFunctor : public binary_function<Fraction, DoubleIterator, Fraction> { 
      MyFunctor(myClassB& in_class, doubleA) : myClassA(in_class), column(iColumn) {} // Note: constructed with reference to myClassB, so it can access all the objects (functions, data) in myClassB     
      myClassB& myClassB; 
      doubleA; 
      double B = 123.456; 

      double operator()(double B, double A,) { 
       double C = doFancyStuff(A,B); 
       C += doOtherFancyStuff(A,B,C); 
       return C; 
      } 
     } 
     A = 1234 // actually result of some other work in the real code. 
     //use stl to accumulate 
     accumulate(data.begin(), data.end(), temp, MyFunctor(this, A)); //Passing 'this' here so that functor gets a reference to myClassB 
    } 
+0

このコードでは、あらゆる種類のエラーが発生しています。これがC++ 03の場合、ローカルクラスをテンプレート引数として使用することは無効です。 – UncleBens

+0

私はまだC++にはとても新しいです。何をお勧めしますか? – Noah

答えて

0

ファンクタの外にファンクタを移動する必要があります。

新しいC++ 11標準を実装していないコンパイラでは、accumulateなどのテンプレートをローカルクラスでインスタンス化することはできません。

関連する問題