Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2009, 11:32   #1
yaRobot
 
Регистрация: 03.07.2009
Сообщений: 8
По умолчанию друзья помогите!!

Код:
1 #include <iostream>
2 
3 using namespace std;
4 
5 class Dog
6  {
7     public:
8     void Speak()const {cout << "Woof!..\n";}
9     void Move()const{cout << "Walking to heel..\n";}
10    void Eat()const{cout << "Gobbling food..\n";}
11    void Growl()const {cout << "Grrrr\n";}
12    void Whimper()const{cout << "Whining noises..\n";}
13    void RollOver()const{cout << "Rolling over..\n";}
14    void PlayDead()const {cout << "Is this the end of Little Caesar&\n";}
15 };
16
17 typedef void (Dog::*PDF)()const;
18
19  int main()
20 {
21    const int MaxFuncs = 7;
22    PDF DogFunctins[MaxFuncs]={
23    Dog::Speak,
24    Dog::Move,
25    Dog::Eat,
26    Dog::Growl,
27    Dog::Whimper,
28    Dog::RollOver,
29    Dog::PlayDead};
30
31    Dog* pDog = 0;
32    int Method;
33    bool fQuit;
34
35    while(!fQuit)
36    {
37        38cout<<"(0)Quit,(1)Speak,(2)Move,(3)Eat,(4)Growl,(5)Whimper,(6)Roll 39Over,(7)Play Dead: ";
40        cin >> Method;
41        if(Method == 0)
42        {
43            fQuit = true;
44        }
45        else
46        {
47            pDog = new Dog;
48            (pDog->*DogFunctions[Method-1])();
49            delete pDog;
50        }
51    }
52    return 0;
53 }
\Desktop\Documents\uk_func_array.cp p|24|error: invalid use of non-static member function `void Dog::Move() const'|

эта ошибка на всем массиве 23-29

Последний раз редактировалось Sazary; 30.07.2009 в 13:35.
yaRobot вне форума Ответить с цитированием
Старый 30.07.2009, 11:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
PDF DogFunctins[MaxFuncs]={
Э-э-э а это как понимать?

Вот что у мя получилось:
Код:
//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
#include <iostream.h>
//---------------------------------------------------------------------------

#pragma argsused
class Dog
 {
 public:
 void Speak()const {cout << "Woof!..\n";}
 void Move()const{cout << "Walking to heel..\n";}
void Eat()const{cout << "Gobbling food..\n";}
void Growl()const {cout << "Grrrr\n";}
 void Whimper()const{cout << "Whining noises..\n";}
 void RollOver()const{cout << "Rolling over..\n";}
 void PlayDead()const {cout << "Is this the end of Little Caesar&\n";}
 };

int _tmain(int argc, _TCHAR* argv[])
{
 Dog* adog=0;
 adog=new Dog;
 adog->Move();
 getchar();
	return 0;
}
//---------------------------------------------------------------------------
Смори и сравнивай ошибки
I'm learning to live...

Последний раз редактировалось Stilet; 30.07.2009 в 11:46.
Stilet вне форума Ответить с цитированием
Старый 30.07.2009, 11:55   #3
yaRobot
 
Регистрация: 03.07.2009
Сообщений: 8
По умолчанию

это массив из указателей на методы класса.
на обычные функции он создается, а как начинаю на методы создавать то не хотят присваиваться.
чего уже только не попробывал
yaRobot вне форума Ответить с цитированием
Старый 30.07.2009, 12:04   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Извращение так делать (мое мнение). У вас ошибка в синтаксисе

В строке
Код:
PDF DogFunctins[MaxFuncs]={
напишите
Код:
PDF DogFunctions[MaxFuncs]={
И тут
Код:
bool fQuit
напишите так
Код:
bool fQuit=false;
, а то бесконечный цикл будет. Stilet привел нормальный пример. Советую вам им воспользоваться.

Последний раз редактировалось profi; 30.07.2009 в 12:08.
profi вне форума Ответить с цитированием
Старый 30.07.2009, 12:07   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это массив из указателей на методы класса.
Пардон, а чегоб не сделать массив экземпляров этого класса?
Или в Си это делается именно так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2009, 12:15   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

А кто будет указывать компилятору, что именно указатель на функцию нужен?
Код:
...
PDF DogFunctions[MaxFuncs]={
 &Dog::Speak,
 &Dog::Move,
 &Dog::Eat,
 &Dog::Growl,
 &Dog::Whimper,
 &Dog::RollOver,
 &Dog::PlayDead};
...
ЗЫ. Так человеку надо вызывать методы по их номеру, как я понял. Ввёл пользователь единичку, собака залаяла и так далее. Можно конечно в switch'e вызывать соответствующий метод, но с массивом указателей решение изящнее выглядит

Последний раз редактировалось pu4koff; 30.07.2009 в 12:19.
pu4koff вне форума Ответить с цитированием
Старый 30.07.2009, 12:19   #7
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
А кто будет указывать компилятору, что именно указатель на функцию нужен?
Т.е.? Не сильно понятно, что вы имели ввиду. Имя функции это её адрес. Объявлен массив указателей и инициализирован. Т.е. фактически под каждый указатель массива DogFunctions будет "подставлен" адрес функции.
profi вне форума Ответить с цитированием
Старый 30.07.2009, 12:22   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Код:
А кто будет указывать компилятору, что именно указатель на функцию нужен?
Т.е.? Не сильно понятно, что вы имели ввиду. Имя функции это её адрес. Объявлен массив указателей и инициализирован. Т.е. фактически под каждый указатель массива DogFunctions будет "подставлен" адрес функции.
Для метода класса необходимо указывать, что необходим именно адрес.
netrino вне форума Ответить с цитированием
Старый 30.07.2009, 12:24   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Т.е.? Не сильно понятно, что вы имели ввиду.
Амперсанд надо просто дописать для получения указателя на методы. Некоторые компиляторы и без этого знака "съедают" код и будет всё это работать. В данном же случае компилятор расценивает запись Dog::Speak как попытку вызова метода и говорит, что вы пытаетесь вызвать нестатический константный метод как статический, т.е. без указания конкретного объекта.
pu4koff вне форума Ответить с цитированием
Старый 30.07.2009, 12:43   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но с массивом указателей решение изящнее выглядит
Это что-то типа интерфейсов? По-моему плохая идея. Ничего в них удобного нет...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с задачей. пожалуйста,друзья! makro_200& Помощь студентам 0 03.04.2009 20:45
Друзья помогите пожалуйста с задачками! sting Паскаль, Turbo Pascal, PascalABC.NET 32 07.07.2008 17:05