Форум программистов, компьютерный форум 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" подробнее

Показать сообщение отдельно
CatsCanFly
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
30.07.2013, 00:54  [ТС]     Повторный вызов конструктора?!
И снова небольшой вопрос Извиняюсь за назойливость:
вот мой класс на данный момент:
Кликните здесь для просмотра всего текста
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
class CString
{
private:
    char* str;
    int len;
    int real_size;
public:
    CString() : len(0), real_size(0)
    {
 
    }
 
    CString(char str_arg[])
    {
        this->len = strlen(str_arg);
        this->real_size = this->len + 10;
        this->str = new char[this->real_size];
        this->set(str_arg);
    }
 
    CString (const CString & x)
    {
        this->len = x.len;
        this->real_size = x.real_size;
        this->str = new char[this->real_size];
        this->set(x.str);
    }
 
    CString & operator=(char str_arg[])
    {
        this->len = this->strlen(str_arg);
        if (this->len >= this->real_size)
        {
            this->reallocate(this->len + 10);
        }
        this->set(str_arg);
        return *this;
    }
 
    CString & operator =(const CString & x)
    {
        this->len = x.len;
        if (this->len >= this->real_size)
            this->reallocate(this->len + 10);
        this->set(x.str);
        return *this;
    }
 
    CString operator + (const CString & x)
    {
        int new_len = this->len + x.len;
        int new_r_size = this->real_size + x.len;
        char* temp = concat_chars(x.str, x.len);        
        return CString(new_r_size, new_len, temp);
    }
 
    CString operator + (char str_arg[])
    {
        int arg_len = this->strlen(str_arg);
        int new_len = this->len + arg_len;
        int new_r_size = this->real_size + arg_len;
        char* temp = concat_chars(str_arg, arg_len);        
        return CString(new_r_size, new_len, temp);
    }
 
    bool operator == (const CString & _str)
    {
        if (this->len != _str.len)
            return false;
        for (int i = 0; i < this->len; i++)
        {
            if (_str.str[i] != this->str[i])
                return false;
        }
        return true;
    }
 
    bool operator != (const CString & _str)
    {
        if (this->len != _str.len)
            return true;
        for (int i = 0; i < this->len; i++)
        {
            if (_str.str[i] != this->str[i])
                return true;
        }
        return false;
    }
 
    char &operator [] (int addr)
    {
        return this->str[addr];
    }
 
    ~CString()
    {
        delete[] this->str;
    }
 
private:
    CString (int _real_size, int _len, char* _str)
    {
        this->len = _len;
        this->real_size = _real_size;
        this->str = _str;
    }
 
    int strlen(char str_arg[])
    {
        int i;
        for(i = 0; str_arg[i] != 0; i++);
        return i;
    }
 
    void reallocate(int new_length)
    {
        this->real_size = new_length;
        delete[] this->str;
        this->str = new char[this->real_size];
    }
 
    void set(char* str_arg)
    {
        for(int i = 0; str_arg[i] != 0; i++)
        {
            this->str[i] = str_arg[i];
        }
        str[this->len] = 0;
    }
 
    char* concat_chars(char* part2, int len2)
    {
        int new_len = this->len + len2;
        char* temp = new char[this->real_size + len2];
        int pointer;
        for(pointer = 0; pointer < this->len; pointer++)
        {
            temp[pointer] = this->str[pointer];
        }
        for(int i = 0; pointer < new_len; pointer++, i++)
        {
            temp[pointer] = part2[i];
        }
        temp[new_len] = 0;
        return temp;
    }
 
    friend ostream & operator << (ostream & output, CString & _str)
    {
        output << _str.str;
        return output;
    }
};

Если сделать так:
C++
1
2
3
CString str1 = "text";
CString str2 = "other";
CString str3 = str1 + str2;
то создается временный объект внутри кода перегруженного оператора + и возвращается им. Только тут получается, что после присваивания str3 мы временный объект теряем, соответственно указатель на массив char который он в себе содержит, и возможность освободить от него память, то есть получаем утечку памяти. Я прав? Подскажите пожалуйста, как решить такую проблему. VLK в своем решении использовал тот же подход что и я, и как понимаю там проблема эта тоже должна быть.
 
Текущее время: 23:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru