2013-07-23 4 views
2


Я пытаюсь определить в .cpp-файле атрибут, который должен быть массивом указателей на функции-члены класса 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» как массив функций.
Я предполагаю, что определение типа worng поэтому мне нужно знать, как я могу сделать правильный

+0

В чем вопрос? – hivert

+2

Что вы на самом деле пытаетесь достичь здесь? –

ответ

2

Синтаксис довольно запутанным один:

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

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

Путь, чтобы добраться до этого, постепенно увеличивая сложность, используя cdecl.org, чтобы проверить себя на каждом шагу:

int (*hFunctions)() 

declare hFunctions as pointer to function returning int


int (Hand::*hFunctions)() 

declare hFunctions as pointer to member of class Hand function returning int

Warning: Unsupported in C -- 'pointer to member of class'


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

declare hFunctions as array of pointer to member of class Hand function returning int

Warning: Unsupported in C -- 'pointer to member of class'


Теперь замените int на bool (к сожалению, cdecl.org не понимает bool); поэтому вы получите синтаксис объявления.

Для определения замените hFunctions вручную :: hFunctions и добавьте часть инициализации, как и вы.

+0

cdecl.org, я не знал этого инструмента, спасибо! Если это сработало для C++, было бы еще лучше – user1754322

+0

Подождите, похоже, поддержка большинства C++ тоже ... – user1754322

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](); 
+0

Спасибо! Это не совсем то, что я просил, потому что у меня были проблемы, когда я должен был сказать компилятору, что «hfunctions является членом Hand» в файле .cpp. В любом случае, я многому научился из вашего ответа, например, что использование typedef делает это проще. – user1754322

2

Both the array and the functions are members of Hand and the array is static(please correct me if it should not).

Если я правильно понял, что вы просите, вы не должны. Вы должны абстрагировать операцию как базовый класс, специализировать ее и удерживать массив как массив указателей на базовый класс:

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

«вы не должны» - я предполагаю, что это означает: «вы не должны реализовывать это так, как вы делали»; вопрос был «должен ли массив быть статическим?». В любом случае +1. – anatolyg

+0

Да, речь шла о том, чтобы не реализовать его таким образом. Обычно, когда вам нужно создать массив функций для абстрактного поведения, это означает «идти виртуально». – utnapistim

+0

Мне нужно научиться, чтобы понять этот ответ. Спасибо за попытку. – user1754322

Смежные вопросы