Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Gladis
0 / 0 / 0
Регистрация: 26.03.2012
Сообщений: 5
#1

Рудиментарный класс String - C++

18.05.2012, 16:10. Просмотров 439. Ответов 2
Метки нет (Все метки)

Этот код из учебника Либерти, проверялся уже не единожды, из-за этого не могу закончить тему массивов...
Помогите разобраться, пожалуйста, в чем здесь ошибка:

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
//Использование класса String
#include <iostream>
#include <conio.h>
#include <string.h>
 
using namespace std;
//Рудиментарный класс String
class String
{
    public:
 
    //Конструкторы
    String ();
    String (const char *const);
    String (const String &);
    ~String ();
 
    //Перегруженные операторы
    char & operator [] (unsigned short offset);
    char operator [] (unsigned short offset)const;
    String operator+ (const String&);
    void operator+=(const String&);
    String & operator= (const String &);
 
    //Основные методы доступа
    unsigned short GetLen() const {return itsLen;}
    const char * GetString() const {return itsString;}
 
    private:
    String (unsigned short); //Закрытый конструктор
    char * itsString;
    unsigned short itsLen;
};
 
    //Конструктор по умолчанию создает строку нулевой длины
    String::String()
    {
        itsString = new char [1];
        itsString[0] = '\0';
        itsLen = 0;
    }
 
    //Закрытый вспомогательный конструктор
    //используется только методами только методами класса
    //строк требуемой длины с нулевым наполнением
    String::String (unsigned short len)
    {
        itsString = new char[len+1];
        for(unsigned short i=0; i<=len; i++)
        itsString [i] = '\0';
        itsLen = len;
    }
 
    //Преобразование массива символов в строку
    String::String (const char * const cString)
    {
        itsLen = strlen (cString);
        itsString = new char [itsLen+1];
        for(unsigned short i=0; i<itsLen; i++)
          itsLen [i] = cString [i];
        itsString [itsLen] = '\0';
    }
 
    //Конструктор-копировщик
    String::String (const String & rhs)
    {
        itsLen = rhs.GetLen();
        itsString = new char [itsLen+1];
        for(unsigned short i=0; i<itsLen; i++)
          itsString[i] = rhs[i];
        itsString[itsLen] = '\0';
    }
 
    //Деструктор по освобождению памяти
    String::~String ()
    {
        delete [] itsString;
        itsLen = 0;
    }
 
    //Оператор присваивания освобождает память и копирует туда string и size
    String &String::operator=(const String & rhs)
    {
        if(this == &rhs)
          return *this;
        delete [] itsString;
        itsLen = rhs.GetLen();
        itsString = new char [itsLen+1];
        for(unsigned short i=0; i<itsLen; i++)
            itsString[i] = rhs[i];
        itsString[itsLen] = '\0';
          return *this;
    }
    //Неконстантный оператор индексирования возвращает ссылку на символ так,
    //что его можно изменить
    char & String::operator[] (unsigned short offset)
    {
        if(offset > itsLen)
           return itsString[itsLen-1];
        else
            return itsString[offset];
    }
 
    //Константный оператор индексирования для использования с константными
    //объектами (см. конструктор-копировщик!)
    char String::operator[] (unsigned short offset) const
    {
        if(offset > itsLen)
           return itsString[itsLen-1];
        else
            return itsString[offset];
    }
 
    //Создание новой строки путем добавления текущей строки к rhs
    String String::operator+(const String& rhs)
    {
        unsigned short totalLen = itsLen + rhs.GetLen();
        unsigned short i;
        for(i=0; i<itsLen; i++)
          temp[i] = itsString[i];
        for(unsigned short j=0; j<rhs.GetLen(); j++, i++)
          temp[i] = rhs[j];
        temp[totalLen] = '\0';
        return temp;
    }
 
    //Изменяет текущую строку и возввращает void
    void String::operator+=(const String& rhs)
    {
         unsigned short rhsLen = rhs.GetLen();
         unsigned short totalLen = itsLen + rhsLen;
         String temp(totalLen);
         unsigned short i;
           for(i=0; i<itsLen; i++)
             temp[i] = itsString[i];
           for(unsigned short j=0; j<rhs.GetLen(); j++, i++)
           temp[i] = rhs[i-itsLen];
           temp[totalLen] = '\0';
           *this = temp;
    }
 
    int main ()
    {
      String s1("initial test");
      cout << "S1:\t " << s1.GetString() << endl;
 
      char * temp = "Hello Word";
      s1 = temp;
      cout << "S1:\t " << s1.GetString () << endl;
 
 
      char tempTwo[20];
      strcpy (tempTwo, "; nice to be here!");
      s1 += tempTwo;
      cout << "TempTwo:\t " << tempTwo << endl;
      cout << "S1: \t" << s1.GetString() << endl;
 
      cout << "S1[4]: \t" << s1[4] << endl;
      s1[4] = 'x';
      cout << "S1: \t" << s1.GetString() << endl;
 
      cout << "S1[999]: \t" << s1[999] << endl;
 
      String s2 (" Another string");
      String s3;
      s3 = s1+s2;
      cout << "S3: \t" << s3.GetString() << endl;
 
      String s4;
      s4 = "Why does this work?";
      cout << "S4: \t" << s4.GetString() << endl;
 
 
      cout << endl << "Press any key for continue...";
      getch ();
      return 0;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 16:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Рудиментарный класс String (C++):

Здравствуйте! Создал класс std::string. Не создается объкт типа string... Подскажите в чем причина? - C++
#include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; //using namespace std; class string { private: int...

Реализовать пользовательские типы: класс Person и класс String - C++
1)Разработать класс Person, который содержит соответствующие члены для хранения: имени, возраста, пола и телефонного номера. ...

класс string - C++
товарищи,пишу лабу,простенькую,в принципе,но почему-то фэйлюсь. в ведённой строке за один просмотр найти все слова,состоящие только из...

класс String - C++
//main #include &lt;iostream&gt; #include &quot;header.h&quot; const int ArSize = 10; const int MaxLen =81; int main() { using std::cout; ...

Класс string - C++
Добрый день, друзья. #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main (void) { string obj = &quot;one...

Класс String - C++
добрый день. У кого-то есть программа которая создаёт класс String – строку, используя динамическую память. Определить операторы &quot;+&quot;...

2
-=ЮрА=-
Заблокирован
Автор FAQ
18.05.2012, 16:42 #2
Цитата Сообщение от Gladis Посмотреть сообщение
проверялся уже не единожды, из-за этого не могу закончить тему массивов...
- ну и что ты проверял???
Надо было сесть и просто исправить ошибки которые содержит код
Ошибка 1

Цитата Сообщение от Gladis Посмотреть сообщение
for(unsigned short i=0; i<itsLen; i++)
itsLen [i] = cString [i];
itsLen это же не строка это переменная содержит её длинну и даже тип другой от char имеет!
Цитата Сообщение от Gladis Посмотреть сообщение
private:
String (unsigned short); //Закрытый конструктор
char * itsString;
unsigned short itsLen;
Цитата Сообщение от Gladis Посмотреть сообщение
for(i=0; i<itsLen; i++)
temp[i] = itsString[i];
- А память кто под temp выделять будет?

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
#include <iostream>
#include <conio.h>
#include <string.h>
 
using namespace std;
//Рудиментарный класс String
class String
{
private:
    String (unsigned short); //Закрытый конструктор
    char * itsString;
    unsigned short itsLen;
public:
 
    //Конструкторы
    String ();
    String (const char *const);
    String (const String &);
    ~String ();
 
    //Перегруженные операторы
    char & operator [] (unsigned short offset);
    char operator [] (unsigned short offset)const;
    String operator+ (const String&);
    void operator+=(const String&);
    String & operator= (const String &);
 
    //Основные методы доступа
    unsigned short GetLen() const {return itsLen;}
    const char * GetString() const {return itsString;}
};
 
//Конструктор по умолчанию создает строку нулевой длины
String::String()
{
    itsString = new char [1];
    itsString[0] = '\0';
    itsLen = 0;
}
 
//Закрытый вспомогательный конструктор
//используется только методами только методами класса
//строк требуемой длины с нулевым наполнением
String::String (unsigned short len)
{
    itsString = new char[len+1];
    for(unsigned short i=0; i<=len; i++)
    itsString [i] = '\0';
    itsLen = len;
}
 
//Преобразование массива символов в строку
String::String (const char * const cString)
{
    itsLen = strlen (cString);
    itsString = new char [itsLen+1];
    for(unsigned short i=0; i<itsLen; i++)
        itsString[i] = cString[i];
    itsString [itsLen] = '\0';
}
 
//Конструктор-копировщик
String::String (const String & rhs)
{
    itsLen = rhs.GetLen();
    itsString = new char [itsLen+1];
    for(unsigned short i=0; i<itsLen; i++)
    itsString[i] = rhs[i];
    itsString[itsLen] = '\0';
}
 
//Деструктор по освобождению памяти
String::~String ()
{
    delete [] itsString;
    itsLen = 0;
}
 
//Оператор присваивания освобождает память и копирует туда string и size
String &String::operator=(const String & rhs)
{
    if(this == &rhs)
    return *this;
    delete [] itsString;
    itsLen = rhs.GetLen();
    itsString = new char [itsLen+1];
    for(unsigned short i=0; i<itsLen; i++)
        itsString[i] = rhs[i];
    itsString[itsLen] = '\0';
    return *this;
}
//Неконстантный оператор индексирования возвращает ссылку на символ так,
//что его можно изменить
char & String::operator[] (unsigned short offset)
{
    if(offset > itsLen)
        return itsString[itsLen-1];
    else
        return itsString[offset];
}
 
//Константный оператор индексирования для использования с константными
//объектами (см. конструктор-копировщик!)
char String::operator[] (unsigned short offset) const
{
    if(offset > itsLen)
        return itsString[itsLen-1];
    else
        return itsString[offset];
}
 
//Создание новой строки путем добавления текущей строки к rhs
String String::operator+(const String& rhs)
{
    unsigned short totalLen = itsLen + rhs.GetLen();
    unsigned short i;
    char * temp = new char[totalLen + 1];
    for(i=0; i<itsLen; i++)
        temp[i] = itsString[i];
    for(unsigned short j=0; j<rhs.GetLen(); j++, i++)
        temp[i] = rhs[j];
    temp[totalLen] = '\0';
    return temp;
}
 
//Изменяет текущую строку и возввращает void
void String::operator+=(const String& rhs)
{
    unsigned short rhsLen = rhs.GetLen();
    unsigned short totalLen = itsLen + rhsLen;
    String temp(totalLen);
    unsigned short i;
    for(i=0; i<itsLen; i++)
        temp[i] = itsString[i];
    for(unsigned short j=0; j<rhs.GetLen(); j++, i++)
        temp[i] = rhs[i-itsLen];
    temp[totalLen] = '\0';
    *this = temp;
}
 
int main ()
{
    String s1("initial test");
    cout << "S1:\t " << s1.GetString() << endl;
 
    char * temp = "Hello Word";
    s1 = temp;
    cout << "S1:\t " << s1.GetString () << endl;
 
 
    char tempTwo[20];
    strcpy (tempTwo, "; nice to be here!");
    s1 += tempTwo;
    cout << "TempTwo:\t " << tempTwo << endl;
    cout << "S1: \t" << s1.GetString() << endl;
 
    cout << "S1[4]: \t" << s1[4] << endl;
    s1[4] = 'x';
    cout << "S1: \t" << s1.GetString() << endl;
 
    cout << "S1[999]: \t" << s1[999] << endl;
 
    String s2 (" Another string");
    String s3;
    s3 = s1+s2;
    cout << "S3: \t" << s3.GetString() << endl;
 
    String s4;
    s4 = "Why does this work?";
    cout << "S4: \t" << s4.GetString() << endl;
 
 
    cout << endl << "Press any key for continue...";
    system("pause");
    return 0;
}
0
Миниатюры
Рудиментарный класс String  
Gladis
0 / 0 / 0
Регистрация: 26.03.2012
Сообщений: 5
18.05.2012, 17:39  [ТС] #3
Огромное спасибо, заработало...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2012, 17:39
Привет! Вот еще темы с ответами:

Класс String - C++
Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.( Visual C++)

Класс String - C++
вот файл реализации String::String() //конструктор на 80 { size = 80; str = new char; for (int i = 0;i &lt; size;i++) ...

Класс String - C++
Всем привет, помогите пожалуйста. Ошибка на этапе выполнения. Скомпилируйте программу, с помощью стрелочек(клавиш) перейдите на 2 пункт...

Класс <string> - C++
Подскажите пожалуста, как переписать из строки str первые n байтов в строку str1, а остальные в строку str2?


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

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

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