У меня есть функция, которая происходит от другого класса, который, в свою очередь, происходит от виртуального базового класса.
Внутри этой функции есть функтор.Функтор должен иметь возможность доступа ко всем объектам внутри этой функции и ее родительского класса.Но при передаче ссылки на «this» или на имя функции я получаю сообщение об ошибке.
Причина всего этого усложнения заключается в ускорении кода.Алгоритм, который я кодирую, действительно имеет только одну дорогую часть.Мое намерение состоит в том, чтобы распараллелить эту часть.Однако этот шаг накапливает более двух значений одновременно, за несколько шагов.Итак, мне нужно переопределить некоторые операторы.Функтор кажется наиболее простым способом реализации этого.
Функтору необходимо иметь доступ к объектам в myClassA и myClassB, поэтому мне нужно создать его со ссылкой на myClassB.(Так как B спускается с A, все должно быть доступно.)
Проблема в том, что когда я пытаюсь передать функтор в строку накопления, я получаю ошибки об отсутствии соответствующей функции.Я пробовал "это", "* это", "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
}