например, что в c ++ означает typedef void (Number :: * Action) (int &); - PullRequest
1 голос
/ 15 марта 2011

Привет, у меня есть этот пример шаблона команды из Интернета, но есть кое-что, что я не понимаю, это вещь typedef, что такое * Action represns здесь, я даже не определил этот метод ... вот пример кода:

#include <iostream>
#include <vector>
using namespace std;

class Number
{
  public:
    void dubble(int &value)
    {
        value *= 2;
    }
};

class Command
{
  public:
    virtual void execute(int &) = 0;
};

class SimpleCommand: public Command
{
    typedef void(Number:: *Action)(int &);
    Number *receiver;
    Action action;
  public:
    SimpleCommand(Number *rec, Action act)
    {
        receiver = rec;
        action = act;
    }
     /*virtual*/void execute(int &num)
    {
        (receiver-> *action)(num);
    }
};

class MacroCommand: public Command
{
    vector < Command * > list;
  public:
    void add(Command *cmd)
    {
        list.push_back(cmd);
    }
     /*virtual*/void execute(int &num)
    {
        for (int i = 0; i < list.size(); i++)
          list[i]->execute(num);
    }
};

int main()
{
  Number object;
  Command *commands[3];
  commands[0] = &SimpleCommand(&object, &Number::dubble);

  MacroCommand two;
  two.add(commands[0]);
  two.add(commands[0]);
  commands[1] = &two;

  MacroCommand four;
  four.add(&two);
  four.add(&two);
  commands[2] = &four;

  int num, index;
  while (true)
  {
    cout << "Enter number selection (0=2x 1=4x 2=16x): ";
    cin >> num >> index;
    commands[index]->execute(num);
    cout << "   " << num << '\n';
  }
}

Ответы [ 3 ]

5 голосов
/ 15 марта 2011

typedef определяет указатель на функцию, которая является методом класса Number и принимает int.

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

2 голосов
/ 15 марта 2011

с использованием http://www.cdecl.org (очень полезный сайт) с void(Number:: *Action)(int &) в качестве входных данных (обратите внимание, что он не обрабатывает typedefs) дает следующее:

объявляет Action как указатель начлен функции Number класса (ссылка на int) return void Предупреждение: не поддерживается в C - 'указатель на член класса' Предупреждение: не поддерживается в C - 'ссылка'

1 голос
/ 15 марта 2011
 typedef void(Number:: *Action)(int &);

Этот typedef определяет тип с именем Action. Тип Action является указателем на функцию-член для функции-члена класса Number, тип параметра которого int&, а тип возвращаемого значения void.

Поскольку Action - это имя типа, поэтому вы видите это имя в конструкторе SimpleCommand.

SimpleCommand(Number *rec, Action act)
{               //see this ^^^^^^ - being used as type!
    receiver = rec;
    action = act;
}
...