массив указателей на функции-члены: заставить его работать - PullRequest
1 голос
/ 02 октября 2011

В следующем коде я получаю сообщение об ошибке:

a value of type (double*)(const double& arg) const cannot be assigned to an entity of type pt2calculateA

Любые предложения о том, как заставить это работать?

class myClass {
    private:

    typedef double (*pt2calculateA)(double);

    pt2calculateA calculateA[2];

public:

    myClass () {
        calculateA[0] = &calculateA1; //->error
        calculateA[1] = &calculateA2; //->error
    }

    double calculateA1(const double& arg) const {
            ...
    }

    double calculateA2(const double& arg) const {
        ...
    }
}

Ответы [ 4 ]

7 голосов
/ 02 октября 2011

myClass::calculateA1() не является функцией ;скорее это функция-член .Таким образом, типы, естественно, не совместимы.

Тип &myClass::calculcateA1 равен double (myClass::*)(const double &) const, который является функцией указателя на член (PTFM).Обратите внимание, что вы можете использовать PTMF только вместе с указателем на экземпляр объекта (т. Е. myClass*).

Если вы измените свой typedef, вы можете как минимум правильно сохранить указатели:

typedef double (myClass::*pt2calculateA)(const double &) const;

Вы должны будете сказать &myClass::calculateA1 и т. Д., Чтобы взять адрес.

В C ++ 11 вы можете инициализировать массив в списке инициализатора:

myClass() : calculateA{&myClass::calculateA1, &myClass::calculateA2} { }
1 голос
/ 02 октября 2011

Попробуйте это:

class myClass {
    private:

    typedef double (myClass::*pt2calculateA)(const double&) const;

    pt2calculateA calculateA[2];

public:

    myClass () {
        calculateA[0] = &myClass::calculateA1;
        calculateA[1] = &myClass::calculateA2;
    }

    double calculateA1(const double& arg) const {
        //    ...
    }

    double calculateA2(const double& arg) const {
        //  ...
    }
};
0 голосов
/ 02 октября 2011

pt2calculateA объявляется как указатель на функцию, а не как указатель на функцию-член.

см. здесь

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

Не только тип параметра отличается между typedef и фактическими функциями, но также один является указателем на функцию, а другой - указателем на функцию-член. myClass::calculateA1 имеет тип double (myClass::*)(const double& arg) const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...