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

Классы - C++

Восстановить пароль Регистрация
 
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
09.12.2013, 01:35     Классы #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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdlib.h>
#include "iostream"
 
using namespace std;
 
template <class T> //Шаблон Pr класса с параметром T
class Pr  //Объявили класс
{
  T x;
int n;
bool A_1(T x, int n) {return x < n;}//Меньше 1
bool A_1_1(T x, int n) {return (x !=0 && x!= 1);}//Не 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;}//Проверка на целое
 
typedef void (*P)();//указатель на функцию
 
   public:
   Pr(T,int)
 {
    memset(Pf,A_1,A_1_1,A_0_1,A_0,A_n,A_2 , sizeof(Pf));
 
 }
  P Pf [6];//объявим массив из указателей на функцию
  T Oshibka (const int,const int,P Pf[]);//
  void Serror( const int);//Функция вывода строк (массив указателей)
 // void get_x(){cin>>x;}  //Функция доступна из любого места программы.
  T GetChislo ();
  void Show() //Функция внутри класса (метод класса)
         {
          cout<<x; //Метод Show отображает значение а
         }
} ;
 
int main()
{
 system("chcp 1251 > nul");
 int b;
 Pr<int> s1;
 cout << " Введите число 2  "<<"\n";
 //s1.get_x();  //Обращаемся к объекту класса и через него вызываем функцию ввода данных
 b =s1.GetChislo ();
  cout<<s1.Oshibka (5,2,Pf);  //Обращаемся к объекту класса
  return 0;
}
template <class T> T Pr <T>::GetChislo ()
{
    while (!(cin >> x) || cin.peek() != '\n')
    {
        cin.clear();
        while (cin.get() != '\n');Serror(6);
    }
 return x;
}
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];
}
 template <class T> T Pr <T>::Oshibka (const int M,const int N,P Pf[])//Функция принимает указатели на функции
{
 
    x =GetChislo ();
    while ( Pf [M])
    {
        Serror(N);
    x = GetChislo();
    }
 
return x;
}
Куча ошибок хотя сами функции работают.Тоже самое просто с указателями и с массивом указателей корректно работает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2013, 01:35     Классы
Посмотрите здесь:

C++ Классы
Классы C++
C++ КЛАССЫ
C++ Классы
Классы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.12.2013, 02:15     Классы #2
C++
1
Pr<int> s1;
Чтобы так создавать объект, должен быть конструктор по умолчанию.
C++
1
cout<<s1.Oshibka (5,2,Pf);
Pf - это что? Может так?
C++
1
cout << s1.Oshibka(5,2,s1.Pf);
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
09.12.2013, 23:07  [ТС]     Классы #3
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
Pr<int> s1;
Чтобы так создавать объект, должен быть конструктор по умолчанию.
C++
1
cout<<s1.Oshibka (5,2,Pf);
Pf - это что? Может так?
C++
1
cout << s1.Oshibka(5,2,s1.Pf);
В этой строке я понял свою ошибку спасибо.
C++
1
cout<<s1.Oshibka (5,2,s1.Pf);  //Обращаемся к объекту класса
А как создать объект не понял и как передавать в функции сравнения число n не пойму.x берется из класса, а n нужно передавать в класс.К массивам я обращаюсь по индексам.

Добавлено через 23 минуты
Попробовал в классе создать объект
C++
1
}s1 ;
ошибка.
C++
1
Pr s1;
так тоже ошибка.А как правильно не знаю.

Добавлено через 20 часов 6 минут
Вот что получилось,но снова ошибка в 24 строке.
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
81
82
83
84
85
#include <stdlib.h>
#include "iostream"
#include <cstring>
 
using namespace std;
 
template <class T> //Шаблон Pr класса с параметром T
class Pr  //Объявили класс
{
  T x;
int n;
bool A_1(T x, int n) {return x < n;}//Меньше 1
bool A_1_1(T x, int n) {return (x !=0 && x!= 1);}//Не 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;}//Проверка на целое
 
   public:
   typedef void (*P)();//указатель на функцию
   P Pf [6];//объявим массив из указателей на функцию
   Pr(T x,int n)//конструктор
 {
    memset(Pf,A_1,A_1_1,A_0_1,A_0,A_n , sizeof(Pf));//Ошибка
 
 }
 //P Pf [6];//объявим массив из указателей на функцию
 
  T Oshibka (const int,const int,P Pf[]);//
  void Serror( const int);//Функция вывода строк (массив указателей)
  void get_x(){cin>>x;}  //Функция доступна из любого места программы.
  T GetChislo ();
  void Show() //Функция внутри класса (метод класса)
         {
          cout<<x; //Метод Show отображает значение
         }
} ;
 
int main()
{
 system("chcp 1251 > nul");
 Pr<int> Pr(0,2);
 cout << " Введите число 2  "<<"\n";
 Pr.get_x();  //Обращаемся к объекту класса и через него вызываем функцию ввода данных
  cout<<Pr.Oshibka (5,2,Pr.Pf);  //Обращаемся к объекту класса
  return 0;
}
template <class T> T Pr <T>::GetChislo ()
{
    while (!(cin >> x) || cin.peek() != '\n')
    {
        cin.clear();
        while (cin.get() != '\n');Serror(6);
    }
 return x;
}
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];
}
 template <class T> T Pr <T>::Oshibka (const int M,const int N,P Pf[])//Функция принимает указатели на функции
{
 
    x =GetChislo ();
    while ( Pf [M])
    {
        Serror(N);
    x = GetChislo();
    }
 
return x;
}
Пожалуйста подскажите хоть что нибудь иногда и намека бывает достаточно.
alsav22
09.12.2013, 23:36
  #4

Не по теме:

Во втором посте я вам чем-нибудь помог?

Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
09.12.2013, 23:40  [ТС]     Классы #5
Да.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 00:41     Классы #6
Цитата Сообщение от Genn55 Посмотреть сообщение
ошибка в 24 строке.
У memset() три параметра должно быть (второй int). Что за класс у вас?
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
10.12.2013, 00:46  [ТС]     Классы #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
81
82
83
84
85
#include <stdlib.h>
#include "iostream"
#include <cstring>
 
using namespace std;
 
template <class T> //Шаблон Pr класса с параметром T
class Pr  //Объявили класс
{
  T x;
int n;
bool A_1(T x, int n) {return x < n;}//Меньше 1
bool A_1_1(T x, int n) {return (x !=0 && x!= 1);}//Не 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;}//Проверка на целое
 
   public:
   typedef void (*P)();//указатель на функцию
   P Pf [6];//объявим массив из указателей на функцию
     Pr(T X,int C)//конструктор
 {
   x = X;
   n = C;
    memset(Pf,A_1,A_1_1,A_0_1,A_0,A_n , sizeof(Pf));//Ошибка
 
 }
  Pr()//конструктор
{
  T Oshibka (const int,const int,P Pf[]);//
  void Serror( const int);//Функция вывода строк (массив указателей)
  //void get_x(){cin>>x;}  //Функция доступна из любого места программы.
  T GetChislo ();
}
 
} ;
 
int main()
{
 system("chcp 1251 > nul");
 Pr<int> Pr(0,2);
 cout << " Введите число 2  "<<"\n";
 Pr.GetChislo ();  //Обращаемся к объекту класса и через него вызываем функцию ввода данных
 cout<<Pr.Oshibka (5,2,Pr.Pf);  //Обращаемся к объекту класса
  return 0;
}
template <class T> T Pr <T>::GetChislo ()
{
    while (!(cin >> x) || cin.peek() != '\n')
    {
        cin.clear();
        while (cin.get() != '\n');Serror(6);
    }
 return x;
}
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];
}
 template <class T> T Pr <T>::Oshibka (const int M,const int N,P Pf[])//Функция принимает указатели на функции
{
 
    x =GetChislo ();
    while ( Pf [M])
    {
        Serror(N);
    x = GetChislo();
    }
 
return x;
}
овсем запутался.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 00:47     Классы #8
В чём идея класса?
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
10.12.2013, 00:52  [ТС]     Классы #9
Цитата Сообщение от alsav22 Посмотреть сообщение
У memset() три параметра должно быть (второй int). Что за класс у вас?
А я почему то считаю ,что конструктор принимает параметры для функций сравнения.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 00:55     Классы #10
Цитата Сообщение от Genn55 Посмотреть сообщение
А я почему то считаю ,что конструктор принимает параметры для функций сравнения.
Я разве про параметры конструктора написал?
Цитата Сообщение от alsav22 Посмотреть сообщение
У memset() три параметра
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
10.12.2013, 01:06  [ТС]     Классы #11
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём идея класса?
Пользователь вводитс клавиатуры число.Если ввод верный число принимается как есть,если не верный выдается сообщение об ошибке и предлагается повторный ввод пока не будет верным.условия задаются с места ввода.

Добавлено через 10 минут
C++
1
memset(Pf,A_1,A_1_1,A_0_1,A_0,A_n , sizeof(Pf));
я им никогда не пользовался в первые пытаюсь использовать,но в последнем посте здесь ошибки нет,если конечно я правильно понял.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 01:16     Классы #12
http://www.cplusplus.com/reference/c...set/?kw=memset

Добавлено через 2 минуты
Pf[6] - это массив под указатели на методы класса (A_1, A_1_1 и т.д.) или под что другое?
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
10.12.2013, 01:23  [ТС]     Классы #13
Получается так.Выходит memset() не принимает bool ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 02:02     Классы #14
Цитата Сообщение от Genn55 Посмотреть сообщение
Получается так.
Если это ответ на это:
Цитата Сообщение от alsav22 Посмотреть сообщение
Pf[6] - это массив под указатели на методы класса (A_1, A_1_1 и т.д.)
, то вы в курсе, что объявление указателя на функцию отличается от объявления указателя на метод класса?
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
10.12.2013, 02:08  [ТС]     Классы #15
Вот это наверное и есть моя глобальная ошибка.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 03:40     Классы #16
Цитата Сообщение от Genn55 Посмотреть сообщение
Вот это наверное и есть моя глобальная ошибка.
Там ошибок - немеряно...

Добавлено через 15 минут
Вот код (вам для размышлений), который работает на ввод 1 или 0:
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
81
82
83
84
85
86
87
88
89
90
#include <stdlib.h>
#include <iostream>
#include <cstring>
 
using namespace std;
 
template <class T> //Шаблон Pr класса с параметром T
class Pr  //Объявили класс
{
    T x;
    int n;
    bool A_1(T x) {return x < 1;} //Меньше 1
    bool A_1_1(T x) {return (x != 0 && x!= 1);} //Не 0 и не 1
    bool A_0_1(T x){return x >= 1;}//Больше или = 1
    bool A_0(T x){return x == 0;}//Если 0
    bool A_n(T x){return x > n;}//Больше числа
    //bool A_2(int x){return x % n;}//Проверка на целое
 
public:
    typedef bool (Pr::*P)(T);//указатель на метод
    P Pf[6]; // массив указателей на методы 
    Pr()
    {
        Pf[0] = &Pr::A_1;
        Pf[1] = &Pr::A_1_1;
        Pf[2] = &Pr::A_0_1;
        Pf[3] = &Pr::A_0;
        Pf[4] = &Pr::A_n;
        //Pf[5] = &Pr::A_2;
    }
 
    T Oshibka (const int, const int, P Pf[]);//
    void Serror( const int);//Функция вывода строк (массив указателей)
    void get_x(){cin >> x;}  //Функция доступна из любого места программы.
    T GetChislo ();
    void Show() //Функция внутри класса (метод класса)
    {
        cout << x; //Метод Show отображает значение
    }
};
 
 
int main()
{
    //system("chcp 1251 > nul");
    setlocale(0, "");
    Pr<int> pr;
    cout << " Введите число 1 или 0\n";
    //pr.get_x();  //Обращаемся к объекту класса и через него вызываем функцию ввода данных
    cout << pr.Oshibka (1, 0, pr.Pf);  //Обращаемся к объекту класса
    return 0;
}
template <class T> T Pr <T>::GetChislo ()
{
    while (!(cin >> x) || cin.peek() != '\n')
    {
        cin.clear();
        while (cin.get() != '\n');
        Serror(6);
    }
    return x;
}
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];
}
template <class T> T Pr <T>::Oshibka (const int M, const int N, P Pf[])//Функция принимает указатели на функции
{
    x = GetChislo();
    while ((this ->*Pf[M])(x))
    {
        Serror(N);
        x = GetChislo();
    }
 
    return x;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2013, 20:40     Классы
Еще ссылки по теме:

C++ Классы
Классы в С++ C++
C++ классы C++

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

Или воспользуйтесь поиском по форуму:
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
10.12.2013, 20:40  [ТС]     Классы #17
Цитата Сообщение от alsav22 Посмотреть сообщение

, то вы в курсе, что объявление указателя на функцию отличается от объявления указателя на метод класса?

Огромное вам спасибо.Это все меняет в корне.В том то и дело,что как начинающий оказался не в курсе.Подсказать не кому,а сам не уловил.Только сейчас дошло.Еще раз огромное спасибо.

Добавлено через 5 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Там ошибок - немеряно...
Да теперь я бы удивился если бы их не было.За пример отдельное спасибо.Буду все писать сначала по моему так будет лучше.
Yandex
Объявления
10.12.2013, 20:40     Классы
Ответ Создать тему
Опции темы

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