【问题标题】:Static member array of pointers to member functions指向成员函数的指针的静态成员数组
【发布时间】:2013-07-23 21:37:15
【问题描述】:


我试图在 .cpp 文件中定义一个属性,该属性应该是指向名为 Hand 的类的成员函数的指针数组。
数组和函数都是 Hand 的成员,并且数组是静态的(如果不应该,请纠正我)。
这是我达到的:

static bool Hand::*(Hand::hfunctions)[] ()=
{&Hand::has_sflush,&Hand::has_poker,&Hand::has_full,&Hand::has_flush,
&Hand::has_straight,&Hand::has_trio,&Hand::has_2pair,&Hand::has_pair};                                              


我收到此错误:hand.cpp:96:42: 错误:将“hfunctions”声明为函数数组。
我猜类型定义已经过时了,所以我需要知道如何使定义正确

【问题讨论】:

  • 有什么问题?
  • 您实际上想在这里实现什么?

标签: c++ arrays function pointers static


【解决方案1】:

语法相当复杂:

class Hand
{
    bool has_sflush();
    static bool (Hand::*hfunctions[])();
    ...
};

bool (Hand::*Hand::hfunctions[])() = {&Hand::has_sflush, ...};

解决此问题的方法是逐渐增加复杂性,使用cdecl.org 在每个步骤中检查自己:

int (*hFunctions)()

将 hFunctions 声明为指向返回 int 的函数的指针


int (Hand::*hFunctions)()

将 hFunctions 声明为返回 int 的类 Hand 函数成员的指针

警告:C 中不支持-'指向类成员的指针'


int (Hand::*hFunctions[])()

将 hFunctions 声明为指向返回 int 的类 Hand 函数成员的指针数组

警告:C 中不支持-'指向类成员的指针'


现在将int 替换为bool(遗憾的是,cdecl.org 不理解bool);所以你得到了声明的语法。

对于定义,将 hFunctions 替换为 Hand::hFunctions,并添加初始化部分,就像你做的那样。

【讨论】:

  • cdecl.org,我不知道那个工具,谢谢!!如果它适用于 c++ 会更好
【解决方案2】:

数组和函数都是 Hand 的成员,并且数组是静态的(如果不应该,请纠正我)。

如果我正确理解您的问题,您不应该。您应该将操作抽象为基类,对其进行专门化并将数组保存为指向基类的指针数组:

struct Match // need a better name
{
     virtual bool matches() = 0;
     virtual ~Match() = default;
};

struct MatchSFlush: public Match { ... };

class Hand
{
    static std::vector<std::unique_ptr<Match>> matches;
};

【讨论】:

  • “你不应该” - 我想这意味着“你不应该按照你的方式实现它”;问题是“数组应该是静态的吗?”。无论如何+1。
  • 是的,它是关于不以这种方式实现的。通常当你需要创建一个函数数组来抽象行为时,这意味着“去虚拟化”。
  • 我必须进行研究才能理解这个答案。感谢您的努力。
  • 我的意思是,你的 has_sflush、has_poker(等等)函数不应该是 Hand 中的一组成员函数,而是它之外的类层次结构。
【解决方案3】:

如果你有 非静态 没有参数并返回 bool 的成员函数,你应该写类似

typedef bool (Hand::*hfunction_non_static)();
hfunction_non_static f_non_static [] =
{
    &Hand::has_sflush,
    &Hand::has_poker,
    .......
}; 
Hand h;
(h.*f_non_static[0])();

如果你有 静态 函数,你应该写类似

typedef bool (*hfunction_static)();
hfunction_static f_static [] = {&Hand::has_sflush, ....};
f_static[0]();

【讨论】:

  • 谢谢!这并不是我要问的,因为当我不得不在 .cpp 文件中告诉编译器“hfunctions 是 Hand 的成员”时,我遇到了麻烦。无论如何,我从您的回答中学到了很多东西,例如 typedef 的使用使这更容易。
猜你喜欢
  • 2010-11-02
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多