例如c ++中的含义是指typedef void(Number :: * Action)(int&);

时间:2011-03-15 07:17:31

标签: c++ typedef

嗨我有来自网络的这个命令模式示例,但有一些我不理解的是typedef的东西,这里的* Action represns我甚至没有定义这个方法...这里是代码示例:< / p>

#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 个答案:

答案 0 :(得分:5)

typedef定义指向函数的指针,该函数是类Number的方法并接受int

请注意,当您提供实际功能时,它是dubble,并且已实现。但是你可以添加更多,当你这样做时 - 你只会更改Number类,而不是Command和其他类。

答案 1 :(得分:2)

使用http://www.cdecl.org(一个非常有用的网站)作为输入{请注意,它不会处理void(Number:: *Action)(int &))这样做:

  

将Action声明为指向成员的指针   class Number函数(参考   int)返回void警告:   C中不支持 - 指向成员的指针   类'警告:C中不支持 -   '参考'

答案 2 :(得分:1)

 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;
}