Как назвать указатель на метод из другого метода

У меня была эта проблема некоторое время назад, и я сдался, но в последнее время она возвратилась.

#include 

class element2D;

class node2D
{
public:
    void (element2D::*FunctionPtr)();
    void otherMethod()
    { std::cout << "hello" << std::endl;
        ((this)->*(this->FunctionPtr))(); //ERROR<-------------------
    }

};

class element2D
{
public:
    node2D myNode;
    void doSomething(){ std::cout << "do something" << std::endl; }
};

int main()
{
    element2D myElement;

    myElement.myNode.FunctionPtr = &element2D::doSomething; //OK
    ((myElement).*(myElement.myNode.FunctionPtr))();        //OK

    return 0;
}

Я получаю ошибку в отмеченной строке:

pointer to member type 'void (element2D::)()' incompatible with object type 'node2D'

Я был бы действительно благодарен за справку. Был подобный вопрос сегодня, который частично помог мне: ссылка. Но это, кажется, не полное решение моей проблемы.

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

Спасибо за внимание

5
задан Community 23 May 2017 в 10:28
поделиться

2 ответа

"this" является указателем на node2D, но FunctionPtr ссылается на член element2D - это и есть ошибка.

#if 0 // сломанная версия

void otherMethod()
{ std::cout << "hello" << std::endl;
    ((this)->*(this->FunctionPtr))(); //ERROR<-------------------
}

#else // исправленная версия

void otherMethod( element2D * that )
{ std::cout << "hello" << std::endl;
    ((that)->*(this->FunctionPtr))();
}

#endif

Затем вы вызываете его с помощью чего-то вроде:

myElement.myNode.otherMethod( &myElement );

Есть вещи, которые вы могли бы сделать, чтобы улучшить это, но это должно помочь вам начать.

5
ответ дан 14 December 2019 в 19:10
поделиться

Вам понадобится указатель на объект element2D, если вы хотите вызвать указатель на член element2D. Рассмотрите возможность использования Boost.Function или Boost.Signals2 для тех функций, которые вам нужны.

0
ответ дан 14 December 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: