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

Класс - преобразование массива в строку - C++

Восстановить пароль Регистрация
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
07.07.2013, 15:36     Класс - преобразование массива в строку #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
#include <iostream> 
 
class str
{
public:
 
~str() // Деструктор, удаляет массив
{
delete[] stroka;
dlina_stroki = 0;
}
 
str() // Конструктор по умолчанию, создает массив нулевой длины
{
stroka = new char[1];
stroka[0] = '\0';
dlina_stroki = 0;
}
 
str(const char *rhs) // конструктор, преобразует массив символов в строчку
{
dlina_stroki = strlen(rhs); // устанавливаем длину массива при помощи оператора strlen
stroka = new char[dlina_stroki +1]; // выделяем память под массив на 1 элемент больше
 
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = rhs[i]; } // переводим полученные данные (rhs) в свой массив (stroka)
stroka[dlina_stroki] = '\0'; // вставляем в последний элемент массива пробел 
}
 
str(const str & rhs) // конструктор копировщик, работает по тому же принципу что и конструктор выше
{
dlina_stroki = rhs.get_dlina_stroki();
stroka = new char[dlina_stroki + 1];
 
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = rhs[i]; }
stroka[dlina_stroki] = '\0';
}
 
char operator[] (int rhs) const
 
{
if (dlina_stroki < rhs)
{ return stroka[dlina_stroki - 1]; }
else
{ return stroka[rhs]; }
}
 
char & operator[] (int rhs) 
{  
if (dlina_stroki < rhs)
{ return stroka[dlina_stroki - 1]; }
else
{ return stroka[rhs]; }
}
 
str & operator= (const str & rhs) // оператор равно для класса str 
{
if (this == &rhs) // проверяем, не пытаемся ли мы приравнять один и тот же объект т.е. var = var
{ return *this; } // если пытаемся, то просто возвращаем ссылку на него
 
delete[] stroka; // удаляем, то, что есть сейчас
dlina_stroki = rhs.get_dlina_stroki(); // узнаем новую длину строки
stroka = new char[dlina_stroki + 1]; // выделяем память под новый массив
 
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = rhs[i];  } // переводим полученные данные (rhs) в свой массив (stroka)
stroka[dlina_stroki] = '\0'; // вставляем в последний элемент массива пробел
return *this; // возвращаем новое значение
}
 
str operator+ (const str & rhs)
{
int temp_dlina_stroki = get_dlina_stroki() + rhs.get_dlina_stroki(); // Узнаем необходимую длину строки для двух объектов
str temp(temp_dlina_stroki + 2); // выделяем память под новый временный объект
int i = 0;
int j = 0;
 
for (i; i < dlina_stroki; i++)
{ temp[i] = stroka[i]; } // переводим первую часть во временный массив
 
temp[i] = ' '; // вставляем между массивами (строчками) пробел
i++;
 
for (j ; j < rhs.get_dlina_stroki(); j++, i++ ) 
{ temp[i] = rhs[j];  } // переводим вторую часть во временный массив
 
temp[temp_dlina_stroki + 1] = '\0'; // вставляем в последний элемент массива пробел
return temp; // возвращаем в качестве результата временны объект
}
 
 
char *get_stroka() const { return stroka; } // функция член, возвращает массив
int get_dlina_stroki() const { return dlina_stroki; } // функция член, возвращает длину массива
void show_stroka() const { std::cout << stroka << "\n"; } // функция член, выводит на экран строку
 
private:
str(int rhs)
{
dlina_stroki = rhs;
stroka = new char[dlina_stroki +1];
for (int i = 0; i < dlina_stroki; i++)
{ stroka[i] = '\0'; }
stroka[dlina_stroki] = '\0';
}
 
 
char *stroka; // массив в котором хранится строка
int dlina_stroki; // длина массива
};
 
 
int main()
{
 
str sOne("Hello world!");
str sTwo("Nice day!");
str sThree("test");
 
sThree.show_stroka();
sThree = sOne;
sThree.show_stroka();
sThree = sOne + sTwo;
sThree.show_stroka();
 
system("pause");
return 0;
}


Пожалуйста, что делает член функция в строках 40-47 и 49 - 55, только пожалуйста не в 3-х словах, а поподробнее, что в частности будет являться rhs

Так же что именно делает закрытый конструктор в строке 98-105

И еще вопрос, подскажите как сделать что бы я мог самостоятельно вводить вводить текст после запуска программы т.е. :

C++
1
2
int var;
std::cin >> var;
А как сделать подобное в моей программе и на сколько это сложно?


Просьба, не нужно давать другой код, например strcat и т.д. мне бы хотелось решить все эти проблемы (или те которые можно) при помощи библиотеки iostream
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
07.07.2013, 16:40     Класс - преобразование массива в строку #2
1) Оператор [], получает символ по заданному индексу. Если заданный индекс больше длины строки, возвращает последний символ. rhs - это индекс символа, который нужно получить.

2) Создает строку заданной длины и забивает ее нуль терминаторами.

3) Можно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
  char buf[256];
  std::cout << "Input string 1: ";
  std::cin.getline(buf, 256);
  str sOne(buf);
  std::cout << "Input string 2: ";
  std::cin.getline(buf, 256);
  str sTwo(buf);
  std::cout << "Input string 3: ";
  std::cin.getline(buf, 256);
  str sThree(buf);
 
  sThree.show_stroka();
  sThree = sOne;
  sThree.show_stroka();
  sThree = sOne + sTwo;
  sThree.show_stroka();
 
  system("pause");
  return 0;
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
07.07.2013, 17:01  [ТС]     Класс - преобразование массива в строку #3
1. А т.е. этот оператор проверяет число внутри [], если оно больше чем у rhs, то он отнимает 1 ?

2. Примерно ясно, не ясно только str(int rhs) - int rhs откуда берется, а точнее когда я ее писал, примерно откуда берется этот int rhs я знал, сейчас подзабыл ладно, пофиг.

3. Не совсем то, что хотел, как я понимаю мы тут все же используем массив, определенной длинны, я просто хотел без длинны, что бы длинна сама определялась при работе программы при вводе с клавиатуры. А вот char buf[256], 256 это максимальная длинна, больше нельзя? например char buf[300]
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
07.07.2013, 17:10     Класс - преобразование массива в строку #4
VLK,
1) Длина - 1 это последний символ массива.

2) int rhs - это параметр, передается в конструктор при вызове. Это и есть длина строки, которая будет создана.

3) Можно больше. В любом случае ограничение при вводе будет. Ну или можно например, сперва спросить пользователя максимальную длину строки, пусть он введет, и такое ограничение и ставить, но это не лучший выбор.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
07.07.2013, 17:23  [ТС]     Класс - преобразование массива в строку #5
2-3 понятно, а вот с 1 не до конца

т.е. этот оператор:
operator[] (int rhs)

он работает с

objOne[10] = objTwo[20] (числа разные для наглядности)

длину строки он будет проверять из objOne, а вот rhs в данном случае будет являться 20 из objTwo[20], правильно?
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
07.07.2013, 18:24     Класс - преобразование массива в строку #6
Цитата Сообщение от VLK Посмотреть сообщение
objOne[10] = objTwo[20]
Это значит, что он на позицию 10 массива objOne поместит символ с индексом 20 из массива objTwo.
Например если objOne равен "Hello world", а objTwo равен "Hello world, i study c++", то в результате операции выйдет, что objOne будет равен: "Hello worly", а ObjTwo не изменится
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
08.07.2013, 12:45  [ТС]     Класс - преобразование массива в строку #7
В каком случае выполнится строчка return stroka[dlina_stroki - 1], я вот сделал программку (пишет когда какая строчка выполняется), как не крутил, ни когда не выполнялась эта строчка

Эта строчка нужна для тех случаев когда есть ошибка в программе? и служит для того, что бы массив не вышел за область видимости?
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
10.07.2013, 22:29     Класс - преобразование массива в строку #8
VLK, Вообще, да. Ситуация когда кто-то пытается получить элемент из массива с индексом больше, чем всего элементов, это ошибка. И я тут исключение поставил бы, а не возврат последнего символа. Чтобы выполнилась эта строка, можно написать например:
C++
1
2
str stroka("stroka");
stroka[N]; // где N - число большее либо равное длине строки (в данном случае N = 6 или больше).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 10:27     Класс - преобразование массива в строку
Еще ссылки по теме:

Преобразование типов. Не конструктор не видит класс C++
Преобразование объекта в строку C++
Преобразование числа в строку C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
11.07.2013, 10:27     Класс - преобразование массива в строку
  #9

Не по теме:

Цитата Сообщение от Riderik Посмотреть сообщение
с индексом больше, чем всего элементов,
Еще отрицательные индексы не забудьте

Yandex
Объявления
11.07.2013, 10:27     Класс - преобразование массива в строку
Ответ Создать тему
Опции темы

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