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

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

Восстановить пароль Регистрация
 
Gladis
0 / 0 / 0
Регистрация: 26.03.2012
Сообщений: 5
18.05.2012, 16:10     Рудиментарный класс String #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
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;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 16:10     Рудиментарный класс String
Посмотрите здесь:

Класс Person. Класс String C++
C++ Здравствуйте! Создал класс std::string. Не создается объкт типа string... Подскажите в чем причина?
Класс String C++
Класс <string> C++
C++ Класс String
C++ Класс String
C++ Класс string
C++ класс String

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
18.05.2012, 16:42     Рудиментарный класс String #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;
}
Миниатюры
Рудиментарный класс String  
Gladis
0 / 0 / 0
Регистрация: 26.03.2012
Сообщений: 5
18.05.2012, 17:39  [ТС]     Рудиментарный класс String #3
Огромное спасибо, заработало...
Yandex
Объявления
18.05.2012, 17:39     Рудиментарный класс String
Ответ Создать тему
Опции темы

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