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

Повторный вызов конструктора?! - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сортировка чисел http://www.cyberforum.ru/cpp-beginners/thread930025.html
Всем добрый вечер! Прошу вашего прощения за тупость,и помощи. Мне было поставлено несложное задание на плюсах, но столкнулся с проблемой В написании одного алгоритма - сказывается нехватка знаний. Мне нужен алгоритм, сортирующий (не подходящее слово, но не могу подобрать лучше) числа. Дан матрица, предположим 5*5. Заполнена полностью нулями. Используется двоичная с/с. Нужно чтоб были...
C++ Крестики-нолики, проверка Подскажите пожалуйста как тут реализовать проверку по прямой и по диагонали? #include <iostream> #include <cmath> using namespace std; class Board { protected: http://www.cyberforum.ru/cpp-beginners/thread930012.html
C++ функия NtCreateUserProcess
как использоват эту функцию и какие параметры надо передавать заранее спасибо
Искусственный интелект для игры C++
Подскажите, есть ли современные игры, для которых можно писать интеллект, или игра которая и состоит в том, что бы писать интеллект. Главное не супер качество графики, и еще что либо, а что бы было интересно, и людей было много. Сам искал, но не нашел. Помогите, чем можете.
C++ Объявление переменных в С++ http://www.cyberforum.ru/cpp-beginners/thread929989.html
Начал изучение С++ и возник такой вопрос как повторно производить действия с переменными после их объявления?
C++ Работа с back_inserter(); Почему в алгоритме copy() я не могу использовать back_inserter()? #include <iostream> #include <iterator> #include <vector> #include <deque> #include <algorithm> #include <list> #include <set> #include "my_iterator.h" подробнее

Показать сообщение отдельно
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
29.07.2013, 22:28     Повторный вызов конструктора?!
В учебнике у меня была подобная программа, я ее переписывал \ совершенствовал, вот, может будет интересно:

Кликните здесь для просмотра всего текста
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
#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; // возвращаем в качестве результата временны объект
}
 
void operator+= (const str & rhs)
{
int rhs_dlina_stroki = rhs.get_dlina_stroki();
int obsh_dlina_stroki = rhs_dlina_stroki + dlina_stroki;
 
str temp(obsh_dlina_stroki + 1);
 
int i, w;
 
for (i = 0; i < dlina_stroki; i++)
{ temp[i] = stroka[i]; }
 
for (w = 0; w < rhs_dlina_stroki; w++, i++)
{ temp[i] = rhs[i-dlina_stroki]; }
temp[obsh_dlina_stroki] = '\0';
*this = temp;
// данный оператор выполняет следующие - varOne += varTwo - varOne = varOne + varTwo
}
 
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; // длина массива
};
 
Текущее время: 11:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru