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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
WriterMix
1 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 68
#1

Недопустимое использование типа в качетве выражения С++ - C++

28.02.2012, 23:45. Просмотров 2215. Ответов 6
Метки нет (Все метки)

Добрый вечер всем!
Не могу понять в чем проблема.
Задача такова: создать клас для хранения БД (тел. справочник). Создать производный класс, добавив туда поля (адрес, телефон). Для второго класса использовать конструктор, чтобы он состоял из аргументов, необходимих для инициализации обьекта производного класса. Ну и необходимо создать функции для ввода/вивода/удаления информации.
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include "stdafx.h"
#include<conio.h>
#include<stdio.h>
#include <iostream>
using namespace std;
#include<string.h>
 
class Cmen{
protected:
 char *f;              //Familija
 char *n;              //Name
 char *o;              //Father
public:
 Cmen();
 ~Cmen();
 void input( void );
 void output( void );
 void operator=( Cmen & ) ;
};
 
class CIndivid:public Cmen{
protected:
 char *a;              //Adress
 int t;                //Telephone
public:
 CIndivid();
 ~CIndivid();
 void output( void );
 void input( void );
 void operator=( CIndivid & ) ;
 friend void sort_Individ( CIndivid *p , int r );
 friend void add( CIndivid *p , int r );
};
 
Cmen::Cmen(){
      f=new ( char [10] );
      n=new ( char [10] );
      o=new ( char [10] );
      f ='\0';
      n ='\0';
      o ='\0';
 }
CIndivid::CIndivid():t( 0 ){
          a= new ( char [50] );
          *a= '\0';
}
 
CIndivid::~CIndivid(){
           delete[] a;
}
 
Cmen::~Cmen(){
       delete[] f;
       delete[] n;
       delete[] o;
 }
 
void Cmen::input( void ){
        cout << "Enter familia" << endl ;
         cin >> f ;
        cout << "Enter name" << endl ;
         cin >> n ;
        cout << "Enter father" << endl ;
         cin >> o ;
        cout << "" << endl ;
}
 
void CIndivid::input( void ){
            Cmen::input() ;
            cout << "Enter adress" << endl ;
             cin >> a ;
            cout << "Enter telephone" << endl ;
             cin >> t ;
            cout << "" << endl ;
}
 
void Cmen::output( void ){
         cout << f << " " << n << " " << o << endl ;
}
 
void CIndivid::output( void ){
             Cmen::output();
             cout  << " Adress " << a << endl ;
             cout << " Telephon "  << t << endl << endl ;
 
}
 
void all_output( CIndivid *p ){
           for( int i=0 ; i<50 ; i++ ){
          p[i].CIndivid::output();
          }
}
void Cmen::operator=( Cmen &z2 )
{
           strcpy( f, z2.f ) ;
           strcpy( n, z2.n ) ;
           strcpy( o, z2.o ) ;
}
 
void CIndivid::operator=( CIndivid &z2 ){
            operator=( Cmen &z2 ) ;
            strcpy( a, z2.a ) ;
            t=z2.t ;
}
 
void sort_Individ( CIndivid *p, int r ){
         int i,s ;
         CIndivid k ;
         do { s=0;
            for( i=0 ; i<r ; i++ ){
               if( strcmp( p[i].f , p[i+1].f )>0 )
             k=p[i+1];
             p[i+1]=p[i];
             p[i]=k;
             s=1;
               }
            }while( s==1 );
}
 
void add( CIndivid *p , int r ){
    int c , x=0, i ;
    cout << " Enter skilky objektiv dodaty : " ;
     cin >> x ;
    for( i=0 ; i<r ; i++ ){
       if( p[i].f=='\0' )
         break ;
       }
    for(  c=0 ; c<x ; c++ ){
       p[i+c].input();
       }
}
 
void Deleted( CIndivid *p , int r ){
        int q=0;
        cout << " Enter jakyj ojekt potribno delete : " << endl ;
        cin >> q ;
        for( int i=q ; i<r ; i++ ){
        p[i]=p[i+1] ;
 }
}
 
int menu_pere( CIndivid *p ){
          while( 1 ){
           char u ;
           cout << " all_output { 1 }" << endl ;
           cout << " sort_Individ { 2 } " << endl ;
           cout << " add_object { 3 } " << endl ;
           cout << " Deleted_object { 4 } " << endl ;
           cout << " EXIT { 5 }" << endl << endl ;
           u=getch();
           switch( u ){
             case '1' : all_output( p ) ;        getch();
             case '2' : sort_Individ( p , 50 ) ;  break ;
             case '3' : add( p , 50 ) ;           break ;
             case '4' : Deleted( p , 50 ) ;       break ;
             case '5' : return 0 ;
             }
            }
}
 
void main(){
 CIndivid s[50];
 menu_pere( s );
getch();
}
Вибивает ошибку в строке 102:
error C2275: Cmen: недопустимое использование этого типа в качестве выражения

Как решаеться проблемма? Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2012, 23:45     Недопустимое использование типа в качетве выражения С++
Посмотрите здесь:
C++ Error C1017: недопустимое константное выражение целого типа
C++ Использование неопределённого типа
Использование выражений типа a == b == c; C++
C++ Использование шаблонного типа в shared_ptr
C++ Использование имени типа не допускается
C++ Использование файлового типа данных
C++ IntelliSense: использование имени типа не допускается
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.02.2012, 00:16     Недопустимое использование типа в качетве выражения С++ #2
нужен вызов функции. а эта строка выглядит как объявление функции. Cmem& там лишнее.
но чтобы позвался базовый оператор, надо явно прописать какой оператор зовется:
C++
1
Cmen::operator=(z2);
WriterMix
1 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 68
29.02.2012, 01:12  [ТС]     Недопустимое использование типа в качетве выражения С++ #3
Цитата Сообщение от DU Посмотреть сообщение
нужен вызов функции. а эта строка выглядит как объявление функции. Cmem& там лишнее.
но чтобы позвался базовый оператор, надо явно прописать какой оператор зовется:
C++
1
Cmen::operator=(z2);
Спасибо!
К сожалению, не работает функция добавления данных. Пишет:
Недопустимое использование типа в качетве выражения С++
Можете написать правильный код данной функции?
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.02.2012, 01:34     Недопустимое использование типа в качетве выражения С++ #4
В студии хороший дебагер. Учитесь пользоваться.

исправленный конструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cmen::Cmen(){
          f=new ( char [10] );
          n=new ( char [10] );
          o=new ( char [10] );
          f[0] ='\0';
          n[0] ='\0';
          o[0] ='\0';
          // или так
          //*f ='\0';
          //*n ='\0';
          //*o ='\0';
          // но не так. тут обнуляются указатели.
          //f ='\0';
          //n ='\0';
          //o ='\0';
 }
WriterMix
1 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 68
29.02.2012, 16:08  [ТС]     Недопустимое использование типа в качетве выражения С++ #5
Цитата Сообщение от DU Посмотреть сообщение
В студии хороший дебагер. Учитесь пользоваться.

исправленный конструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cmen::Cmen(){
          f=new ( char [10] );
          n=new ( char [10] );
          o=new ( char [10] );
          f[0] ='\0';
          n[0] ='\0';
          o[0] ='\0';
          // или так
          //*f ='\0';
          //*n ='\0';
          //*o ='\0';
          // но не так. тут обнуляются указатели.
          //f ='\0';
          //n ='\0';
          //o ='\0';
 }
Поменял, но все равно результата нету
В дебагере, точке останова на cin>f пишет:
Недопустимое использование типа в качетве выражения С++
Помогите мне, пожалуйста, дописать данную программу
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.02.2012, 22:36     Недопустимое использование типа в качетве выражения С++ #6
В дебагере есть еще вкладка Call Stack (в руссом варианте наверно стек вызовов). На картинке вашей не вижу. В общем найдите такую вкладку и используйте тоже. В ней можно увидеть откуда мы пришли в функцию, и какие там были значения переменных.

По поводу ошибки с cin >> f;
Такое только в функции Cmen::input, которая вызывается из функции
void add( CIndivid *p , int r )
Ок, смотрим туда:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void add( CIndivid *p , int r ){
 
  // Дебагер говорит, что r == 50; т.е. размеру массива.
 
        int c , x=0, i ;
        cout << " Enter skilky objektiv dodaty : " ;
         cin >> x ;
        for( i=0 ; i<r ; i++ ){
           if( p[i].f=='\0' )
             break ;
           }
 
  // После этого цикла i будет равно r, т.е. 50.
 
        for(  c=0 ; c<x ; c++ ){
           // p[i + c]  -- с + i всегда больше 50 т.е. тут выход за пределы массива.
           // Это и есть ошибка.
           p[i+c].input();
           }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2012, 21:02     Недопустимое использование типа в качетве выражения С++
Еще ссылки по теме:
Использование переменной типа char в цикле for C++
C++ Использование vector insert и своего типа данных
Использование strlen для объектов типа string C++
C++ Нюансы синтаксиса: использование объектов типа ofstream
C++ Определение типа результата арифметического выражения

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

Или воспользуйтесь поиском по форуму:
WriterMix
1 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 68
01.03.2012, 21:02  [ТС]     Недопустимое использование типа в качетве выражения С++ #7
Цитата Сообщение от DU Посмотреть сообщение
В дебагере есть еще вкладка Call Stack (в руссом варианте наверно стек вызовов). На картинке вашей не вижу. В общем найдите такую вкладку и используйте тоже. В ней можно увидеть откуда мы пришли в функцию, и какие там были значения переменных.

По поводу ошибки с cin >> f;
Такое только в функции Cmen::input, которая вызывается из функции
void add( CIndivid *p , int r )
Ок, смотрим туда:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void add( CIndivid *p , int r ){
 
  // Дебагер говорит, что r == 50; т.е. размеру массива.
 
        int c , x=0, i ;
        cout << " Enter skilky objektiv dodaty : " ;
         cin >> x ;
        for( i=0 ; i<r ; i++ ){
           if( p[i].f=='\0' )
             break ;
           }
 
  // После этого цикла i будет равно r, т.е. 50.
 
        for(  c=0 ; c<x ; c++ ){
           // p[i + c]  -- с + i всегда больше 50 т.е. тут выход за пределы массива.
           // Это и есть ошибка.
           p[i+c].input();
           }
}
Гм... Как же решить проблему? Можете написать код?

Добавлено через 22 часа 1 минуту
Ребят, помогите кто-нибудь, пожалуйста!
Yandex
Объявления
01.03.2012, 21:02     Недопустимое использование типа в качетве выражения С++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru