Что означает этот символ звезды (*) в C ++?- Указатель на участника - PullRequest
0 голосов
/ 17 мая 2018

В моем проекте есть несколько строк в MyClass.h файле

class MyClass{
public:
....

#ifndef __MAKECINT__
  std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects; //!
#endif
....
}
//The Status_e is an enum type
//The TupleInfo is a struct

Я не могу понять, как используется этот * в приведенном выше фрагменте кода.И в файле MyClass.cxx, m_processObjects используется так:

for (unsigned int f = 0; f < m_processObjects.size(); ++f) {
    status = (this->*m_processObjects[f])( m_tuples[i] );
    if ( status == FAILURE ) {
      return EL::StatusCode::FAILURE;
    }
....
}
....

Я никогда не слышал об использовании, подобном this->*blabla, но этот фрагмент кода работает.Так что это значит?

1 Ответ

0 голосов
/ 17 мая 2018

::* обозначает указатель на член .

С окружающим кодом это на самом деле Указатель на функцию-член .

Status_e(MyClass::*)(TupleInfo & info)

является функцией-членом class MyClass, возвращающей Status_e и имеющей один параметр TupleInfo&. (Имя аргумента info здесь бесполезно, но компилятор явно игнорирует его.)

Другой фрагмент в вопросе OP показывает, как его назвать:

status = (this->*m_processObjects[f])(m_tuples[i]);

Хранение указателя на метод будет выглядеть так:

std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects;

...

m_processObjects.push_back(&MyClass::aMethod);

Конечно, подпись MyClass::aMethod должна совпадать.

Упрощенный пример, чтобы продемонстрировать это:

#include <iostream>
#include <vector>

class Test {

  private:
    std::vector<int(Test::*)(const char*)> _tblTestFuncs;
  public:
    Test()
    {
       _tblTestFuncs.push_back(&Test::func1);
       _tblTestFuncs.push_back(&Test::func2);
       _tblTestFuncs.push_back(&Test::func3);
    }

    int func1(const char *caller) { std::cout << "Test::func1 called from '"<< caller << "': "; return 1; }
    int func2(const char *caller) { std::cout << "Test::func2 called from '"<< caller << "': "; return 2; }
    int func3(const char *caller) { std::cout << "Test::func3 called from '"<< caller << "': "; return 3; }

    void call()
    {
      for (size_t i = 0, n = _tblTestFuncs.size(); i < n; ++i) {
        int result = (this->*_tblTestFuncs[i])("Test::call()");
        std::cout << "Return: " << result << '\n';
      }
    }
};

int main()
{
  Test test;
  // test method vector in main()
  std::vector<int(Test::*)(const char*)> tblTestFuncs;
  tblTestFuncs.push_back(&Test::func1);
  tblTestFuncs.push_back(&Test::func2);
  tblTestFuncs.push_back(&Test::func3);
  for (size_t i = 0, n = tblTestFuncs.size(); i < n; ++i) {
    int result = (test.*tblTestFuncs[i])("main()");
    std::cout << "Return: " << result << '\n';
  }
  // test method vector in Test
  test.call();
  // done
  return 0;
}

Выход:

Test::func1 called from 'main()': Return: 1
Test::func2 called from 'main()': Return: 2
Test::func3 called from 'main()': Return: 3
Test::func1 called from 'Test::call()': Return: 1
Test::func2 called from 'Test::call()': Return: 2
Test::func3 called from 'Test::call()': Return: 3

Демонстрация в реальном времени на coliru.com

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