передача класса ссылки на себя функтору с накоплением - PullRequest
0 голосов
/ 30 октября 2011

У меня есть функция, которая происходит от другого класса, который, в свою очередь, происходит от виртуального базового класса.

Внутри этой функции есть функтор.Функтор должен иметь возможность доступа ко всем объектам внутри этой функции и ее родительского класса.Но при передаче ссылки на «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
    }

1 Ответ

0 голосов
/ 30 октября 2011

Вы должны переместить функтор за пределы функции.

Компиляторы, не реализующие новый стандарт C ++ 11, не позволяют создавать экземпляры шаблонов типа accumulate с локальным классом.

...