Почему функции-указатели-члены не имеют доступа к соответствующим элементам?

Вы также можете использовать between:

df[df.some_date.between(start_date, end_date)]
4
задан Lynx 13 July 2018 в 18:25
поделиться

1 ответ

Это происходит потому, что вы применяете один объект m_execute к другому объекту.

Исправьте это, изменив эту строку

(m_b->*m_execute)();
//     ^^^^^^^^^
// Points to your m_execute, not m_b's

на это:

(m_b->*m_b->m_execute)();

Еще лучше добавить функцию-член для запуска собственного выполнения и вызвать его из B::find:

void find() {
    run_my_execute();
    m_b->run_my_execute();
}
void run_my_execute() {
    (this->*m_execute)();
}

Это позволило бы избежать путаницы, по которой указатель должен быть применен к какому объекту.

Демонстрация.

5
ответ дан dasblinkenlight 17 August 2018 в 12:16
поделиться
  • 1
    Вау ... Спасибо ... Много работы застряло из-за этого ... Но я до сих пор не понимаю, почему это работает. m_b является дочерним элементом B, поэтому почему я не могу просто использовать m_b- & gt; * m_execute, так же, как я использовал его в init () – Rahul Naik 13 July 2018 в 18:51
  • 2
    @RahulNaik, это не о m_b, но m_execute. Синтаксис вызова указателя на функцию-член через указатель объекта - (ptr->*pmf)(...). В этом случае указатель на функцию-член принадлежит m_b, поэтому вам нужно сообщить компилятору, что: (ptr->*(m_b->pmf))(...). Поскольку -> имеет более высокий приоритет, чем ->*, дополнительные параны не нужны. Для вас ptr есть m_b, а pmf - m_execute. – chris 13 July 2018 в 18:56
  • 3
    @chris ohhhh ... хорошо .. не знаю о предшествующем. спасибо – Rahul Naik 13 July 2018 в 19:07
  • 4
    @RahulNaik init получает доступ к m_execute членам на двух отдельных объектах - свой в m_execute = someFunc и m_b в m_b->m_execute = otherFunc. У вашей функции find() есть доступ к обоим этим членам, поэтому необходимо указать, какой из них он хочет вызвать. – dasblinkenlight 13 July 2018 в 19:18
Другие вопросы по тегам:

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