Что это за методика C ++ для добавления типов в класс? - PullRequest
4 голосов
/ 29 октября 2009

Я только что нашел некоторый код C ++ (в http://msdn.microsoft.com/en-us/library/k8336763(VS.71).aspx),, который использует технику, которую я никогда не видел прежде, чтобы добавить типы в существующий класс:

class Testpm {
public:
   void m_func1() { cout << "m_func1\n"; }
   int m_num;
};

// Define derived types pmfn and pmd.
// These types are pointers to members m_func1() and m_num, respectively.
void (Testpm::*pmfn)() = &Testpm::m_func1;
int Testpm::*pmd = &Testpm::m_num;

int main() {
   Testpm ATestpm;
   Testpm *pTestpm = new Testpm;

   // Access the member function
   (ATestpm.*pmfn)();
   (pTestpm->*pmfn)();   // Parentheses required since * binds

   // Access the member data
   ATestpm.*pmd = 1;
   pTestpm->*pmd = 2;

   cout  << ATestpm.*pmd << endl
         << pTestpm->*pmd << endl;
}

Может кто-нибудь сказать мне, как называется этот метод определения производных типов, или указать мне некоторую документацию по нему? Я никогда не сталкивался с этим за 13 лет использования C ++ и хотел бы покончить с моим невежеством.

Ответы [ 2 ]

6 голосов
/ 29 октября 2009

Комментарий неправильный: pmfn и pmd вообще не являются «производными типами» (они даже не являются типами!). Они указатели на членов .

4 голосов
/ 29 октября 2009

Я не думаю, что они "добавляют типы" в класс. Кажется, что они просто определяют типы указателей на функции-члены и данные-члены класса, а затем используют их для доступа к функции-члену и члену данных. Подобно тому, как вы объявляете типы для функций, не являющихся членами, но будучи членами класса, синтаксис отличается.

С этого сайта здесь

Что касается их синтаксиса, есть два различные типы указателей на функции: С одной стороны, есть указатели на обычные функции C или статические C ++ функции-члены. С другой стороны есть указатели на нестатический C ++ функции-члены. Основная разница является то, что все указатели на нестатические функции-члены должны быть скрытыми Аргумент: указатель this на экземпляр класса. Всегда держите в ум: эти два типа функций указатели несовместимы с каждым другой.

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