Форум программистов, компьютерный форум 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
31.07.2013, 00:49  [ТС]     Повторный вызов конструктора?!
Цитата Сообщение от VLK Посмотреть сообщение
Ну все правильно, ты когда пишешь
int var = 100;
100 это же не где то там, как я понимаю это временный объект, после присвоения, а наверное после выполнения этой строчки и перехода на новую строчку, данный временны объект будет удален.
Я не знаю точно, я только подозреваю, и я надеюсь профессионалы подтвердят мои догадки.
Это же простые типы а не объекты. Я понимаю это выражение так: в сегмент кода записывается константа 100, дальше ее значение копируется в переменную var, которая находится в стеке. В сегменте кода навсегда остается эта константа 100. Разве не так?

Добавлено через 8 часов 30 минут
И снова мой вопрос) Проблему с удалением временного объекта решил создав новый перегруженный конструктор и оператор присваивания. Вот мой класс сейчас:
Кликните здесь для просмотра всего текста
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
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 (const CString* x)
    {
        this->len = x->len;
        this->str = x->str;
        this->real_size = x->real_size;
    }
 
    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 =(CString* x)
    {
        delete[] this->str;
        this->len = x->len;
        this->str = x->str;
        this->real_size = x->real_size;
        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 new 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 new 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 str = "test";
CString str2 = "test2";
CString str3 = str + str2;
- Все работает правильно, но:
C++
1
2
3
CString str = "test";
CString str2 = "test2";
CString str3 = str + str2 + "ttt";
Компилятор выдает:
Error 2 error C2110: '+' : cannot add two pointers
А если сделать
C++
1
CString str3 = str + str2 + str;
то происходят еще более странные вещи:
Error 6 error C2677: binary '+' : no global operator found which takes type 'CString' (or there is no acceptable conversion)
Error 5 error C2784: 'std::_Revranit<_RanIt,_Base> std::operator +(_Diff,const std::_Revranit<_RanIt,_Base> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'CString'
Error 3 error C2784: 'std::_String_const_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_const_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_const_iterator<_Elem,_Traits,_Alloc>)' : could not deduce template argument for 'std::_String_const_iterator<_Elem,_Traits,_Alloc>' from 'CString'
Error 2 error C2784: 'std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>)' : could not deduce template argument for 'std::_String_iterator<_Elem,_Traits,_Alloc>' from 'CString'
Error 4 error C2784: 'std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'CString'
Помогите разобраться
 
Текущее время: 19:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru