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: エラー: 関数の配列としての '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[])()

int を返すクラス Hand 関数のメンバーへのポインターの配列として hFunctions を宣言します

警告: C ではサポートされていません -- 「クラスのメンバーへのポインター」


int(悲しいことに、cdecl.orgはboolを理解していませんbool);に置き換えます。宣言の構文を取得します。

定義については、hFunctionsHand::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 に答える