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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Сумма и произведение элементов массива http://www.cyberforum.ru/cpp-beginners/thread578765.html
Пожалуйста, помогите, написать программу: В одномерном массиве, состоящем из n вещественных элементов, вычислить: • сумму положительных элементов массива; • произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами. Упорядочить элементы массива по убыванию.
C++ Найти максимальный элемент В матрице размером m*n найти максимальный элемент каждой строки. Результат получить в виде вектора размером n. http://www.cyberforum.ru/cpp-beginners/thread578764.html
C++ Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент
Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент. #include "stdafx.h" #include <iostream.h> #include <windows.h> char bufRus; char* Rus(const char* text) { CharToOem(text, bufRus);
C++ Обход графа: в глубину, ширину. Алгоритм Прима
Есть реализация графа через матрицу смежности. Но у меня получился ступор при реализации алгоритмов обхода и алгоритма Прима. Растолкуйте, кто может, как реализовать. Ниже привожу написанный класс взвешенного, неориентированного графа. //CGraph.h class CGraph { public: CGraph(): count(0),count_rib(0), matrix_val(NULL) {} CGraph(int _count); // конструктор (_count - количество вершин)
C++ Окно нестандартной конфигурации http://www.cyberforum.ru/cpp-beginners/thread578738.html
Здравствуйте, нужен пример программы в ОС Windows, создающей (только с помощью системных функций) окно нестандартной конфигурации. Заранее спасибо.
C++ Разработать алгоритм и программу для определения кратчайшего слова в тексте Разработать алгоритм и программу для определения кратчайшего слова в тексте подробнее

Показать сообщение отдельно
Gladis
0 / 0 / 0
Регистрация: 26.03.2012
Сообщений: 5
18.05.2012, 16:10     Рудиментарный класс String
Этот код из учебника Либерти, проверялся уже не единожды, из-за этого не могу закончить тему массивов...
Помогите разобраться, пожалуйста, в чем здесь ошибка:

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;
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru