2


我试图在 .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: error: 将“hfunctions”声明为函数数组。
我想类型定义已经磨损了,所以我需要知道如何正确定义

4

3 回答 3

2

语法相当复杂:

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 声明为指向类 Hand 函数成员的指针数组,该函数返回 int

警告:C 中不支持——“指向类成员的指针”


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

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

于 2013-07-23T22:17:52.820 回答
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;
};
于 2013-07-23T22:30:48.967 回答
1

如果您有没有参数并返回的非静态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]();
于 2013-07-23T22:09:29.483 回答