Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
FishZone
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
1

Не работает обобщенная инициализирующая функция для конструкторов

06.03.2017, 16:30. Просмотров 160. Ответов 6
Метки нет (Все метки)

Всем привет, делаю очередную программу по книжке Липманна, задание такое - есть класс String, который имеет 3 конструктора, первый является конструктором по-умолчанию, второй - конструктор иницализирующий строку класса встроенным массивом, третий является копирующим конструктором. В саму программу пользователем через поток передаются данные и инициализируются в строку, подсчитывается количество слов, гласных, негласных и т.п. Все работает нормально, но когда я по заданию пишу для конструкторов обощенную инициализирующую функцию, то компилятор мне не показывает никаких ошибок в коде, он просто не хочет компилировать. Посмотрите пожалуйста.

Кликните здесь для просмотра всего текста
Рабочий код:
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
#include <Class_String.h>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <iostream>
 
void _init (const char *str, const String &rhs) {
if (!str && !rhs._string) {
    _size = 0;
    delete [] _string;
    _string = 0;
}
else {
    _size = strlen(str);
    _string = new char[_size+1];
    strcpy(_string, str);
}
else {
    _size = rhs._size;
    _string = new char[_size+1];
    strcpy(_string,rhs._string);
}
}
 
String::String() {
_size =0;
_string = 0;
}
 
inline String::String(const char *str) {
if (!str) {
    _size = 0;
    _string = 0;
}
else {
    _size = strlen(str);
    _string = new char[_size+1];
    strcpy(_string, str);
}
}
 
inline String::String(const String &rhs) {
    _size = rhs._size;
    if ( !rhs._string ) {
        _string = 0;
    }
    else {
        _string = new char[_size+1];
        strcpy(_string,rhs._string);
    }
}
 
inline String::~String() {delete [] _string;}
 
String& String::operator=( const String &rhs) {
    if ( this != &rhs) {
        delete [] _string;
        _size = rhs._size;
    }
    if ( !rhs._string) {
        _string = 0;
    }
    else {
        _string = new char[_size+1];
        strcpy(_string,rhs._string);
    }
    return *this;
};
 
String& String::operator=( const char* s) {
    if (!s) {
        _size = 0;
        delete [] _string;
        _string = 0;
    }
    else {
        _size = strlen(s);
        delete [] _string;
        _string = new char[_size+1];
        strcpy(_string,s);
    }
    return *this;
};
 
bool String::operator==( const String& rhs) {
    if ( _size != rhs._size ) {
        return false;
    }
    return strcmp(_string, rhs._string) ? false : true;
};
 
bool String::operator==( const char* s) {
    return strcmp(_string, s) ? false : true;
};
 
char& String::operator[]( int elem) {
    //assert(elem >= 0 && elem < _size);
    return _string[elem];
};
 
istream& operator>>( istream &io, String &s) {
    int limit_size = 4095;
    char zapas[limit_size];
 
    io >> setw(limit_size) >> zapas;
    s = zapas;
 
    return io;
};
ostream& operator<<( ostream &io,  String &s ) {
    return io << s.c_str();
};
 
int main () {
 
    setlocale(LC_ALL, "russian");
 
    int ix = 0;
 
    int aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0,
    theCnt = 0, itCnt = 0, wdCnt = 0, notVowel = 0;
 
    String Obj1, the("the"), it("it");
 
   while (cin >> Obj1) {
       ++wdCnt;
        cout << Obj1 << ' ';
 
      if (wdCnt % 12 == 0)
           cout << endl;
 
       if (Obj1 == the || Obj1 == "The")
            ++theCnt;
        else
       if (Obj1 == it || Obj1 == "It")
           ++itCnt;
 
           for (int ix = 0; ix < Obj1.s_size(); ix++ )  {
               switch (Obj1[ix])
                {
                   case 'a' : case 'A' : ++aCnt; break;
                   case 'e' : case 'E' : ++eCnt; break;
                   case 'i' : case 'I' : ++iCnt; break;
                   case 'o' : case 'O' : ++oCnt; break;
                   case 'u' : case 'U' : ++uCnt; break;
                   default : ++notVowel; break;
 
                }
            }
 
   }
 
 
 
    system("pause");
 
    return 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
void String::_init (const char *str, const String &rhs) 
{
  if (!str && !rhs._string) 
  {
    _size = 0;
    _string = 0;
  }
  else if (!rhs._string) 
  {
    _size = strlen(str);
    _string = new char[_size + 1];
    strcpy(_string, str);
  }
  else if (!str) 
  {
    _size = rhs._size;
    _string = new char[_size + 1];
    strcpy(_string,rhs._string);
  }
}
 
 
inline String::String() {_init(NULL,NULL); }
 
inline String::String(const char *str) { _init(str,NULL);  }
 
inline String::String(const String &rhs) { _init (NULL,rhs._string); }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2017, 16:30
Ответы с готовыми решениями:

Обобщенная функция перевода строки в число
В книге &quot;С++. Сборник рецептов&quot; нашел обобщенную функцию преобразования строки...

Работа конструкторов в классе и дружественная функция
Есть програмка с классом Meal. К ней я так же написал дружественную функцию с...

Простая прога на использование конструкторов и деструкторов в с++ не работает ( не пойму почему (
Вот и дошла я до конструкторов/деструкторов. Но возникла проблема . Первая...

Функция toupper() не работает для кириллицы
Здравствуйте. Подскажите, пожалуйста, почему программа не работает для русских...

Обобщенная задача кеплера
Добрый день, друзья! Такая проблема. Сказали написать программу для обобщенной...

6
Invader0x7F
Helper C/C++
281 / 158 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
06.03.2017, 16:47 2
Все работает нормально, но когда я по заданию пишу для конструкторов обощенную инициализирующую функцию, то компилятор мне не показывает никаких ошибок в коде, он просто не хочет компилировать.
А какую или какие именно ошибки выдает компилятор ??
0
nd2
2837 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
06.03.2017, 17:14 3
Цитата Сообщение от FishZone Посмотреть сообщение
Рабочий код:
Сам класс где?

Добавлено через 21 минуту
Цитата Сообщение от FishZone Посмотреть сообщение
C++
1
char zapas[limit_size];
Нестандарт.
Цитата Сообщение от FishZone Посмотреть сообщение
C++
1
2
3
ostream& operator<<( ostream &io,  String &s ) {
    return io << s.c_str();
};
Откуда взялся метод c_str() в твоём классе? В выложенных реализациях нет. Class_String.h?
0
FishZone
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
07.03.2017, 15:51  [ТС] 4
Извиняюсь. В общем пока забил на эту функцию, есть другой вопрос. Прилагаю исходники:

Class_String.h

Кликните здесь для просмотра всего текста
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
#ifndef CLASS_STRING_H_INCLUDED
#define CLASS_STRING_H_INCLUDED
 
#include <iostream>
 
using namespace std;
 
class String;
istream& operator>>( istream&, String& );
ostream& operator<<( ostream&, const String& );
 
class String {
public:
String();
String( const char* str);
String( const String& );
 
~String();
 
String& operator=( const String&);
String& operator=( const char*);
 
bool operator==( const String&);
bool operator==( const char*);
 
char& operator[]( int );
 
int s_size() { return _size; }
char* c_str() { return _string; }
int _count( char ch ) const;
 
private:
void _init (const char*, const String&);
int _size;
char *_string;
};
 
 
#endif // CLASS_STRING_H_INCLUDED


Исходный файл cpp:
Кликните здесь для просмотра всего текста
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <Class_String.h>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <assert.h>
 
using namespace std;
 
inline int String::_count(char ch) const {
    //if (!ch) { return 0; }
    int s_count = 0;
    const char *_string_2 = _string;
    for (int _ix = 0; _ix<_size; _ix++) {
    if (ch == _string_2[_ix]) {
        s_count++;
    }
}
    return s_count;
};
 
 
String::String() {
_size =0;
_string = 0;
}
 
inline String::String(const char *str) {
if (!str) {
    _size = 0;
    _string = 0;
}
else {
    _size = strlen(str);
    _string = new char[_size+1];
    strcpy(_string, str);
}
}
 
inline String::String(const String &rhs) {
    _size = rhs._size;
    if ( !rhs._string ) {
        _string = 0;
    }
    else {
        _string = new char[_size+1];
        strcpy(_string,rhs._string);
    }
}
 
inline String::~String() {delete [] _string;}
 
String& String::operator=( const String &rhs) {
    if ( this != &rhs) {
        delete [] _string;
        _size = rhs._size;
    }
    if ( !rhs._string) {
        _string = 0;
    }
    else {
        _string = new char[_size+1];
        strcpy(_string,rhs._string);
    }
    return *this;
};
 
String& String::operator=( const char* s) {
    if (!s) {
        _size = 0;
        delete [] _string;
        _string = 0;
    }
    else {
        _size = strlen(s);
        delete [] _string;
        _string = new char[_size+1];
        strcpy(_string,s);
    }
    return *this;
};
 
bool String::operator==( const String &rhs) {
    if ( _size != rhs._size ) {
        return false;
    }
    return strcmp(_string, rhs._string) ? false : true;
};
 
bool String::operator==( const char* s) {
    return strcmp(_string, s) ? false : true;
};
 
char& String::operator[]( int elem) {
    assert(elem >= 0 && elem < _size);
    return _string[elem];
};
 
istream& operator>>( istream &io, String &s) {
    int limit_size = 4095;
    char zapas[limit_size];
 
    io >> setw(limit_size) >> zapas;
    s = zapas;
 
    return io;
};
ostream& operator<<( ostream &io,  String &s ) {
    return io << s.c_str();
};
 
int main () {
 
    setlocale(LC_ALL, "russian");
 
 
    char s;
    int symbol;
 
    int aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0,
    theCnt = 0, itCnt = 0, wdCnt = 0, notVowel = 0,
    bCnt = 0, dCnt = 0, fCnt = 0, sCnt = 0, tCnt = 0;
 
    String Obj1, the("the"), it("it");
 
    //cout << "Введите символ, который нужно подсчитать: " << endl;
    //cin >> s;
 
    cout << "Программа начинает работу." << endl;
 
    while (cin >> Obj1) {
 
       ++wdCnt;
 
        cout << Obj1 << "\n";
 
 
      if (wdCnt % 12 == 0)
           cout << endl;
 
       if (Obj1 == the || Obj1 == "The")
            ++theCnt;
        else
       if (Obj1 == it || Obj1 == "It")
           ++itCnt;
 
           for (int ix = 0; ix < Obj1.s_size(); ix++ )  {
               switch (Obj1[ix])
                {
                   case 'a' : case 'A' : ++aCnt; break;
                   case 'e' : case 'E' : ++eCnt; break;
                   case 'i' : case 'I' : ++iCnt; break;
                   case 'o' : case 'O' : ++oCnt; break;
                   case 'u' : case 'U' : ++uCnt; break;
                   case 'b' : case 'B' : ++bCnt; break;
                   case 'd' : case 'D' : ++dCnt; break;
                   case 'f' : case 'F' : ++fCnt; break;
                   case 's' : case 'S' : ++sCnt; break;
                   case 't' : case 'T' : ++tCnt; break;
                   default : ++notVowel; break;
 
                }
            }
}
 
 
cout << "Слов: " << wdCnt << '\n'
<< "the/The: " << theCnt << '\n'
<< "it/It: " << itCnt << '\n'
<< "согласных: " << notVowel << '\n'
<< "a: " << aCnt << '\n'
<< "e: " << eCnt << '\n'
<< "i: " << iCnt << '\n'
<< "o: " << oCnt << '\n'
<< "u: " << uCnt << '\n'
<< "b: " << bCnt << '\n'
<< "d: " << dCnt << '\n'
<< "f: " << fCnt << '\n'
<< "s: " << sCnt << '\n'
<< "t: " << tCnt << endl;
 
 
system("pause");
 
 
return 0;
};


Не пойму, почему в самом конце когда цикл while отработал свое, то есть я нажал Enter после ввода текста, он все равно продолжает работать? И в итоге я не могу использовать оператор cout чтобы посмотреть информацию. У меня в cpp в самом верху функция которая подсчитывает количество символов в строке, она еще разрабатывается, не обращайте внимания)

Добавлено через 6 минут
Объясните пожалуйста, что значит вот это: if (wdCnt % 12 == 0) cout << endl;
0
nd2
2837 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
07.03.2017, 19:31 5
Цитата Сообщение от FishZone Посмотреть сообщение
В общем пока забил на эту функцию
На это ответь:
Цитата Сообщение от Invader0x7F Посмотреть сообщение
А какую или какие именно ошибки выдает компилятор ??
Цитата Сообщение от FishZone Посмотреть сообщение
есть другой вопрос.
Другой вопрос - другая тема.
0
FishZone
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
07.03.2017, 23:28  [ТС] 6
В самом коде ошибок компилятор не выявил. Просто как бы программа на долю секунды запускается в CodeBlocks, а после выводится сообщение об ошибке типа pthread_getspecific()
0
DU3
281 / 233 / 115
Регистрация: 07.09.2016
Сообщений: 587
08.03.2017, 00:20 7
цикл будет работать, пока условие тру
while (cin >> Obj1)
или же
while(cin)
после энтера входной поток не портится. т.к. скорее всего вечно будет в цикле крутиться.
если нужен разовый ввод - уберите цикл.


if (wdCnt % 12 == 0) cout << endl;
если остаток от деления на 12 равен нулю.

15 % 12 == 2
24 % 12 == 0
1
08.03.2017, 00:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2017, 00:20

Обобщенная обратная матрица
Всем привет. В общем такая ситуация. Реализовала на с++ нахождение обратной...

Как динамически выделить память для конструкторов класса?
подскажите как динамически выделить память для конструкторов класса? class...

Реализация трех конструкторов и деструктура для класса Date
:gconfusion: :confusion: Разработайте класс DATE, в котором хранится...


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

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

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