Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > массив указателей на фунцию в объявлении класса


Автор: redwhite90 6.2.2012, 20:41
вот хидер
Код

# ifndef COMBINATION_H
# define COMBINATION_H

#include "card.h" 
using namespace std;

const int Number_card_in_combination=7;

class combination
{
    public:
        combination (struct card[]);
    private:
        card card_looking[7];
        void sort();
        int best_card_value();
        int pair();
        int pair_double();
        int set();
        int straight();
        int flush();
        int full_house();
        int four_of_kind();
        int straight_flush();
        int royal_flush();
        int (*mas_of_comb[9])() = {royal_flush,straight_flush,four_of_kind,full_house,flush,straight,set,pair_double,pair};
        
};

# endif


ругается на эту строчку:
Код

int (*mas_of_comb[9])() = {royal_flush,straight_flush,four_of_kind,full_house,flush,straight,set,pair_double,pair};

пишет:
Код

1>c:\users\redwhite\documents\visual studio 2010\projects\poker_calc_05_01_2012_21_00\combination.h(26): error C2059: syntax error : '{'
1>c:\users\redwhite\documents\visual studio 2010\projects\poker_calc_05_01_2012_21_00\combination.h(26): error C2334: unexpected token(s) preceding '{'; skipping apparent function body


не понимаю в чём беда.

Автор: boostcoder 6.2.2012, 21:09
во первых - ты разделом ошибся.
во вторых - 
Цитата(redwhite90 @  6.2.2012,  20:41 Найти цитируемый пост)
int (*mas_of_comb[9])

ты пытаешься создать массив указателей на функции, а инициализируешь его указателями на методы.

в третьих - так инициализировать нельзя, если твой компилятор не поддерживает non static members initializers:
Цитата(redwhite90 @  6.2.2012,  20:41 Найти цитируемый пост)
int (*mas_of_comb[9])() = {royal_flush,straight_flush,four_of_kind,full_house,flush,straight,set,pair_double,pair};


в четвертых - не понятно как ты себе представляешь выполнять вызов методов из того массива...

Код

#include <iostream>

struct type {
   type()
      :mptr({&type::method1}) {}

   int method1()
   {std::cout << "Hello from method1()" << std::endl;}

   typedef int(type::*method_ptr)();
   
   method_ptr mptr[9];
};

int main() {
   type t;
   (t.*(t.mptr[0]))();
}


http://liveworkspace.org/code/36c1768c55ee57a47b4175d09e5d8659

Автор: redwhite90 6.2.2012, 21:21
да, ошибся, правда - перенесите пожалста.
вот так то ведь работает:
Код

# include <iostream>
using namespace std;
int f1()
{
    cout << "f1" << endl;
    return 1;
}
int f2()
{
    cout << "f2" << endl;
    return 1;
}
int main()
{
    int (*ptr[2])()={f1,f2};
    ptr[0]=f1;
    ptr[1]=f2;
    ptr[0]();
    ptr[1]();
    return 0;
}


visual studio 2010 поддерживает?

Добавлено через 1 минуту и 49 секунд
Код

 typedef int(type::*method_ptr)();
   
   method_ptr mptr[9];


можете пояснить эти строки?

Автор: boostcoder 6.2.2012, 21:23
инициализация_массива, и инициализация_массива_члена_класса - ни о чем не говорят? ;)

Добавлено через 41 секунду
или что ты этим кодом хотел сказать?

Добавлено через 2 минуты и 6 секунд
тайпдеф method_ptr как тип указателя на методы класса type.
и декларация массива этих указателей.

Автор: redwhite90 6.2.2012, 21:34
Цитата(boostcoder @  6.2.2012,  21:09 Найти цитируемый пост)
ты пытаешься создать массив указателей на функции, а инициализируешь его указателями на методы.

я думал это одно и тоже.

Цитата(boostcoder @  6.2.2012,  21:23 Найти цитируемый пост)
или что ты этим кодом хотел сказать?

как я представляю вызов методов

Добавлено через 1 минуту и 21 секунду
Цитата(boostcoder @  6.2.2012,  21:23 Найти цитируемый пост)
инициализация_массива, и инициализация_массива_члена_класса - ни о чем не говорят? ;)

говорят

Добавлено через 4 минуты и 14 секунд
а моя VS ругается на ваш код:
Код

#include <iostream>

struct type {
    type()
        :mptr({&type::method1}) {}

    int method1()
    {std::cout << "Hello from method1()" << std::endl;}

    typedef int(type::*method_ptr)();

    method_ptr mptr[9];
};

int main() {
    type t;
    (t.*(t.mptr[0]))();
}


Код

1>c:\users\redwhite\documents\visual studio 2010\projects\test_указатели_на_функции\1.cpp(4): error C2143: syntax error : missing ')' before '{'
1>c:\users\redwhite\documents\visual studio 2010\projects\test_указатели_на_функции\1.cpp(4): warning C4351: new behavior: elements of array 'type::mptr' will be default initialized
1>c:\users\redwhite\documents\visual studio 2010\projects\test_указатели_на_функции\1.cpp(4): error C2143: syntax error : missing ';' before '}'
1>c:\users\redwhite\documents\visual studio 2010\projects\test_указатели_на_функции\1.cpp(4): error C2059: syntax error : ')'
1>c:\users\redwhite\documents\visual studio 2010\projects\test_указатели_на_функции\1.cpp(4): error C2447: '{' : missing function header (old-style formal list?)
1>

Автор: boostcoder 6.2.2012, 21:40
Цитата(redwhite90 @  6.2.2012,  21:34 Найти цитируемый пост)
я думал это одно и тоже.

нет же.
у методов есть скрытый адрес вызова (this), и метод нельзя вызвать без объекта к которому он принадлежит.

Цитата(redwhite90 @  6.2.2012,  21:34 Найти цитируемый пост)
как я представляю вызов методов

это вызов функций, но не методов.

Добавлено через 2 минуты и 6 секунд
ругается из-за этого -
Цитата(redwhite90 @  6.2.2012,  21:34 Найти цитируемый пост)
:mptr({&type::method1})

extended initializer (braces initializer). студия не поддерживает это.

зы
почему не сменишь компилятор на что-то более перспективное? gcc/MinGW к примеру.

Автор: redwhite90 6.2.2012, 21:49
Цитата(boostcoder @  6.2.2012,  21:40 Найти цитируемый пост)
почему не сменишь компилятор на что-то более перспективное? gcc/MinGW к примеру.


это ж под линуксом наверное?

Автор: boostcoder 6.2.2012, 21:56
GCC под линуксом.
MinGW под вендой. вот же: http://forum.vingrad.ru/forum/topic-345601.html

Автор: redwhite90 6.2.2012, 22:04
спасибо, буду иметь ввиду)

а там уж как нить и без массива обойдусь пожалуй

Добавлено через 27 секунд
спасибо, буду иметь ввиду)

а там уж как нить и без массива обойдусь пожалуй

Автор: boostcoder 6.2.2012, 22:06
для спасибоф есть соответствующие кнопки ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)