Форум программистов, компьютерный форум CyberForum.ru

Массив указателей на функцию в классе - C++

Восстановить пароль Регистрация
 
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
14.11.2013, 00:55     Массив указателей на функцию в классе #1
Доброго всем времени суток.Пожалуйста помогите разобраться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdlib.h>
#include "iostream"
 
using namespace std;
 
template <class T> //Шаблон Pr класса с параметром T
class Pr
{
 T x;
bool A_1(T x, int n) {return x < n;}//Меньше 1
bool A_1_1(T x, int n) {return ((x <n)&&(x != 0))||((x>n)&&(x != 0));}//Не 0 и не 1
bool A_0_1(T x, int n = 0){return x >=n;}//Больше или =1
bool A_0(T x, int n){return (x == 0)&&(n ==0);}//Если 0
bool A_n(T x, int n){return x > n;}//Больше числа
bool A_2(int x, int n){return x % n != 0;}//Проверка на целое
typedef void (*P)();//указатель на функцию
void Serror( const int);//Функция вывода строк (массив указателей)
public:Pr()
 {
    memset(Pf,A_1,A_1_1,A_0_1,A_0,A_n,A_2 , sizeof(Pf));
 }
 P Pf [];//объявим массив из указателей на функцию
 T Oshibka (T x, const int n,P Pf[], const int M, const int N)//Функция принимает указатели на функции
{
    x =GetChislo ();
    while ( Pf [M]){Serror(N);x = GetChislo();}
 
return x;
}
T GetChislo ()           //Функция ввода
{
    while (!(cin >> x) || cin.peek() != '\n')
    {
        cin.clear();
        while (cin.get() != '\n');Serror(6);
    }
 return x;
}
};
int main()
{
 system("chcp 1251 > nul");
 int c = 0;
 Pr<int> S;
 cout<<"Введите число "<<"\n";
 c = S.GetChislo ();
 //c = S.Oshibka(c,5,4,0);//Здесь ошибка.
 cout <<"    "<<c<<"\n";
return 0;
}
template <class T>
void Pr <T>::Serror(const int n)
{
const char *Ar[]=
 {
" Число может быть 0 или 1                                  \n",
" Число может быть 1, 2, 3                                  \n",
" Число не может быть не четным и больше 24                 \n",
" Число не может быть   0                                   \n",
" Число не может быть меньше 1                              \n",
" Число  не может быть больше 6                             \n",
" Введен недопустимый символ.Вводить можно числа и точку    \n",
"    ОШИБКА!!!!           ОШИБКА!!!!                        \n"
"        ПОВТОРИТЕ ВВОД!                                    \n"
};
cout << Ar[7];
cout << Ar[n];
}
То же самое написал без класса все работает в классе нет.Программа должна выдавать ошибку и подсказки при не верном вводе любого типа данных.Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
14.11.2013, 01:05     Массив указателей на функцию в классе #2
Цитата Сообщение от Genn55 Посмотреть сообщение
P Pf [];//объявим массив из указателей на функцию
1) чему равен размер?
2) указатель на функцию != указатель на функцию-член
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
14.11.2013, 01:24  [ТС]     Массив указателей на функцию в классе #3
Размер я указал все равно выдает ошибку.Я же только учусь.Понимаю,что указатель на функцию и указатель на функцию-член не одно и тоже,а что делать не знаю.Честно сказать до меня классы никак не доходят.Самостоятельно разобраться очень сложно.И посоветоваться не с кем.Вся надежда только на форум.Если можно хоть как нибудь растолкуйте.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
14.11.2013, 01:29     Массив указателей на функцию в классе #4
Цитата Сообщение от Genn55 Посмотреть сообщение
Самостоятельно разобраться очень сложно.
А книги на что?
Цитата Сообщение от Genn55 Посмотреть сообщение
Если можно хоть как нибудь растолкуйте.
Предлагаете пересказать главу учебника?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,410
14.11.2013, 01:32     Массив указателей на функцию в классе #5
Пример работы с указателями на методы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <clocale>
 
class Nothing
{
  public:
    Nothing() { setlocale(LC_ALL, ""); }
    virtual void print() const = 0;
    void doNothing() const {}
    virtual ~Nothing() {}
};
 
void Nothing::print() const
{
    std::cout << "It's nothing to do" << std::endl;
}
 
class Something : private Nothing
{
  public:
    void print() const
    {
        doNothing();
        std::cout << "С - Сережа и Петя (известно по условию)\n"
                 "Паскаль - Коля, Петя и Сережа (известно по условию)\n"
                 "Бэйсик - Коля\n";
    }
    virtual ~Something() {}
};
 
class Just4Fun : public Something
{
  public:
    Just4Fun() : smth(new Something)
    {
        pfS memf_ptr = &Just4Fun::print;
        (smth->*memf_ptr)();
    }
    ~Just4Fun()
    {
        delete smth;
    }
 
  private:
    typedef void (Something::*pfS)() const;
    Something* smth;
};
 
 
int main()
{
    Just4Fun makeItReal;
}
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
14.11.2013, 02:01  [ТС]     Массив указателей на функцию в классе #6
MrGluck, Не могли бы вы раскомментировать код чтобы легче было разобраться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2013, 02:24     Массив указателей на функцию в классе
Еще ссылки по теме:

Массив указателей на функцию C++
массив указателей на функцию C++
В классе инициализировать массив, в классе создать функцию вывода массива на экран C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,410
14.11.2013, 02:24     Массив указателей на функцию в классе #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <clocale>
 
// базовый абстрактный класс
class Nothing
{
  public:
    Nothing() { setlocale(LC_ALL, ""); } // конструктор по-умолчанию
    virtual void print() const = 0;      // чисто виртуальная функция
    void doNothing() const {}            // обычная виртуальная функция
    virtual ~Nothing() {}                // виртуальный деструктор т.к.
                                         // предполагается наследование
};
 
// реализация чисто-виртуальной функции
// тут некоторые скажут оО , но оно таки существует
void Nothing::print() const
{
    std::cout << "It's nothing to do" << std::endl;
}
 
// класс-наследник от Nothing (Something является производным классом от Nothing)
// используется приватное наследование, что означает, что Something реализуется
// посредством Nothing.
// тут можно загнаться на тему философии, важно лишь помнить, что все поля
// (в т.ч. конструктор) базового класса будут иметь модфиикатор доступа private
class Something : private Nothing
{
  public:
    void print() const // определение чисто-виртуальной функции, класс более не 
    {                  // абстрактный
        doNothing();   // вызываем приватный метод просто чтобы показать, что мы
                       // так умеем
        std::cout << "С - Сережа и Петя (известно по условию)\n"
                 "Паскаль - Коля, Петя и Сережа (известно по условию)\n"
                 "Бэйсик - Коля\n"; // выводим очевидный ответ на неизвестную задачу
    }
    virtual ~Something() {}         // т.к. предполагается наследование от данного
                                    // класса, то делаем конструктор виртуальным
};
 
// наследование означает, что Just4Fun является Something. Я бы сказал, что он
// является что-то с чем-то. Модификаторы доступа для наследуемых членов
// базового класса не изменяются
class Just4Fun : public Something
{
  public:
    Just4Fun() : smth(new Something)     // инициализируем указатель на базовый 
    {                                    // класс новым динам. объектом Something
        pfS memf_ptr = &Just4Fun::print; // объявляем указатель типа pfS на метод
                                         // класса, который наследуется от Something
                                         // (т.к. благодаря тому, что функция print()
                                         // виртуальна в базовом классе, то
                                         // наследуется её интерфейс и реализация
                                         // по-умолчанию)
        (smth->*memf_ptr)();             // вызываем метод, на который указывает
                                         // наш новый указатель, передавая ему
                                         // в качестве аргументов void в круглых
                                         // скобках
    }
    ~Just4Fun()
    {
        delete smth;                     // освобождаем память под динамический
                                         // объект типа Something
    }
 
  private:
    typedef void (Something::*pfS)() const; // объявляем синоним на указатель на
                                            // константный метод Something,
                                            // возвращающий тип void
                                            // и не принимающий никаких аргументов
    Something* smth;                        // указатель на базовый класс
};
 
 
int main()
{
    // делаем это реальным
    Just4Fun makeItReal; // Говорят, тут происходит особая темная магия ]:>
}
Задача, которую решает данный код взята отсюда:
Три ученика и три языка. Определить кто на каком программирует.
Yandex
Объявления
14.11.2013, 02:24     Массив указателей на функцию в классе
Ответ Создать тему
Опции темы

Текущее время: 13:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru