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

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

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

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

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

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

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

Класс String - C++
Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.( Visual 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++
Подскажите пожалуста, как переписать из строки str первые n байтов в строку str1, а остальные в строку str2?

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

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

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

Написать класс String - C++
Здравствуйте, нужна ваша помощь. Требуется написать программу, используя только пункты 3,5,8 и 12 3) class STRING { public: ...

Создать класс String - C++
Есть такое задание. //Создать консольное приложение, содержащее реализацию и практическое применение класса Строка. Данный класс должен...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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
Огромное спасибо, заработало...
Ответ Создать тему
Опции темы

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