413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
1

Классы

09.12.2013, 01:35. Показов 653. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток.Пожалуйста помогите разобраться с классами.Не идут они у меня.Объяснить не кому,а просто читать и делать застопорился.Простенькие получаются чуть посложнее стопор.То же самое делаю без классов все работает в классах нет.Вот мое убожество пожалуйста подскажите в чем я так сильно заблуждаюсь.
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;
}
Куча ошибок хотя сами функции работают.Тоже самое просто с указателями и с массивом указателей корректно работает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2013, 01:35
Ответы с готовыми решениями:

Непонятна тема (Классы содержащие другие классы, как данные члены )
Изучаю книгу Джесс Либерти(в частности эту главу в данный момент) #include &lt;iostream&gt; class...

Программа по классам, которая использует классы точек и прямых на плоскости, а, возможно, и другие классы
Нужно написать программу, которая использует классы точек и прямых на плоскости, а, возможно, и...

Как struct Queue и его операции превратить в классы, то есть нужно сделать тоже самое, но через классы
Как struct Queue и его операции превратить в классы, то есть нужно сделать тоже самое, но используя...

Наследование, базовые классы и производные классы
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и...

16
5498 / 4893 / 831
Регистрация: 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);
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
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;
}
Пожалуйста подскажите хоть что нибудь иногда и намека бывает достаточно.
0
alsav22
09.12.2013, 23:36
  #4

Не по теме:

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

1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
09.12.2013, 23:40  [ТС] 5
Да.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 00:41 6
Цитата Сообщение от Genn55 Посмотреть сообщение
ошибка в 24 строке.
У memset() три параметра должно быть (второй int). Что за класс у вас?
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
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;
}
овсем запутался.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 00:47 8
В чём идея класса?
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
10.12.2013, 00:52  [ТС] 9
Цитата Сообщение от alsav22 Посмотреть сообщение
У memset() три параметра должно быть (второй int). Что за класс у вас?
А я почему то считаю ,что конструктор принимает параметры для функций сравнения.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 00:55 10
Цитата Сообщение от Genn55 Посмотреть сообщение
А я почему то считаю ,что конструктор принимает параметры для функций сравнения.
Я разве про параметры конструктора написал?
Цитата Сообщение от alsav22 Посмотреть сообщение
У memset() три параметра
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
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));
я им никогда не пользовался в первые пытаюсь использовать,но в последнем посте здесь ошибки нет,если конечно я правильно понял.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 01:16 12
http://www.cplusplus.com/refer... ?kw=memset

Добавлено через 2 минуты
Pf[6] - это массив под указатели на методы класса (A_1, A_1_1 и т.д.) или под что другое?
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
10.12.2013, 01:23  [ТС] 13
Получается так.Выходит memset() не принимает bool ?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 02:02 14
Цитата Сообщение от Genn55 Посмотреть сообщение
Получается так.
Если это ответ на это:
Цитата Сообщение от alsav22 Посмотреть сообщение
Pf[6] - это массив под указатели на методы класса (A_1, A_1_1 и т.д.)
, то вы в курсе, что объявление указателя на функцию отличается от объявления указателя на метод класса?
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
10.12.2013, 02:08  [ТС] 15
Вот это наверное и есть моя глобальная ошибка.
0
5498 / 4893 / 831
Регистрация: 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;
}
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
10.12.2013, 20:40  [ТС] 17
Цитата Сообщение от alsav22 Посмотреть сообщение

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

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

Добавлено через 5 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Там ошибок - немеряно...
Да теперь я бы удивился если бы их не было.За пример отдельное спасибо.Буду все писать сначала по моему так будет лучше.
0
10.12.2013, 20:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2013, 20:40
Помогаю со студенческими работами здесь

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.)
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы...

Классы, включающие другие классы
Столкнулся вот с таким кодом: #include &lt;iostream&gt; class Point { public: void SetX(int x) ...

классы/дочерние классы/методы
помогите пожалуйста! надо что выводились только учебеники. чтоб былo через GetTip. h файл...

Классы возможностей(Mixin классы)
Не могу понять смысла использования mixin классов( это класс в котором есть только методы и нет...

Проблема в понимании ООП(абстрактные классы, классы интерфейсы)
Всем здравия. Читал в свое время разные книги(к примеру, Гради Буч по проектированию) вроде все...

Динамические массивы структур;Классы. Класс массивы структур;Классы. Класс динамического массива структур.
Здраствуйте.Помогите с практичкой мое задание 4.3. Строка таблицы данных содержит следующую...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru