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

Вызов деструктора. MSVS и MinGW - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Gui приложение - простая норма прибыли http://www.cyberforum.ru/cpp-beginners/thread424740.html
Разработать GUI-приложение с организацией взаимодействия с БД, реализующее методику оценки привлекательности инвестиционного проекта по методу “Простая норма прибыли”. Кто может помочь?
C++ Вывод на экран csv формат средствами с++ Здравствуйте! Подскажите как это реализовать? Заранее благодарен! http://www.cyberforum.ru/cpp-beginners/thread424737.html
C++ Вывести на печать строку, если она обозначает английское название цвета
Помогите дописать программу. Написана для трех цветов, и в случае не сходства почему то не выдает сообщение об ошибке. Вот задание: Дана строка из латинских букв, после которых следует пробел. Вывести на печать эту строку, если она обозначает английское название цвета (red, blue, green, yellow, black или white), и сообщение об ошибке при вводе строке во всех других случаях.
Ссылка на объект не указывает на экземпляр объекта C++ C++
Создана прога для расчета сопротивления резисторов. В основной функции в некоторых случаях он все считает, а в некоторых - вылетает вот с такой ошибкой: Необработанное исключение типа "System.NullReferenceException" произошло в Курсовая Юля.exe Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта. вот пример "нормального" массива, который он в силах рассчитать: n -...
C++ НовичёкС/С++ http://www.cyberforum.ru/cpp-beginners/thread424712.html
Хочу разобраться С/С++.На уровне хотя бы решения лаб(в основном матем.задачи которые тут выкладывают) Подскажите пожалуйста хорошие "разьясняющие для новичка" книги/видео уроки очень бы приветствовались. Спасибо большое за помощь:)
C++ gethostbyname: получение полного списка ipv4 и ipv6 адресов в текстовом представлении Как-то недоходчиво написано в манах как работать с этой функцией. Я передаю в неё днс, она возвращает заполненную структуру hostent, которая пояснена типо вот так: struct hostent { char *h_name; // официальное имя машины char **h_aliases; // список псевдонимов int h_addrtype; // тип адреса машины int h_length; // длина адреса... подробнее

Показать сообщение отдельно
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
09.01.2012, 02:42  [ТС]     Вызов деструктора. MSVS и MinGW
ForEveR, я вроде понял. сейчас попробую дописать и сравнить результаты.

Добавлено через 1 час 51 минуту
добавил конструктор копирования.
C++
1
2
3
4
5
6
7
8
9
10
11
...
Test(const Test &);
...
 
Test::Test(const int &value) : size(value){
    this->data = new int[size];
    for(int i = 0; i < size; ++i){
        this->data[i] = i;
    }
}
....
Количество вызовов дестурктора в обоих случаях не изменилось. (я полагаю и не должно было).

Переформулирую вопрос.
Если я использую диструктор такого вида:
C++
1
2
3
Test::~Test(){
    delete [] this->data;
}
и хочу после выполнения умножения "присвоить" результат другому объекту типа Test
то как я понимаю наличие перегруженного оператора присвоения обязательно, потому что например в таком случае
C++
1
s = t*2;
сначала вызовется перегруженный оператор умножения который вернет объект типа Test содержащий результат вычислений. после чего будет вызван деструктор который освободит память созданного в операторе умножения объекта и только потом объекту s будет предпринята попытка присвоить адрес объекта возвращаемого перегруженным оператором умножения, а этот объект уже фактически не существует. Результат в s будет мусор.
Теперь я перегрузил оператор присвоения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    
.... 
Test &operator=(const Test &);
.....
Test &Test::operator=(const Test &right){
    if(this != &right){
        if(this->size!=right.size){
            delete [] this->data;
            this->size = right.size;
            this->data = new int[right.size];
        }
        for(int i = 0; i < size; ++i){
            this->data[i] = right.data[i]; 
        }
    }
    return *this;
}
Мой ход мыслей верен ?
Я запускал дебаг в eclipse. прошел пошагово по всему коду и у меня ни разу не был вызван конструктор копирования.... непоняяяятно
(простите за много букв )

КОД В ИТОГЕ

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
#include <iostream>
 
class Test{
public:
    Test(const int &);
    
    Test(const Test &);
    
    ~Test();
 
    Test operator*(const int &);
    Test &operator=(const Test &);
 
    int size;
    int *data;
};
 
Test::Test(const int &value) : size(value){
    this->data = new int[size];
    for(int i = 0; i < size; ++i){
        this->data[i] = i;
    }
}
 
Test::Test(const Test &right) : size(right.size){
    this->data = new int[right.size];
    for(int i = 0; i < this->size; ++i){
        this->data[i] = right.data[i]; 
    }
}
 
Test Test::operator*(const int &right){
    Test temp(this->size);
    for(int i = 0; i < size; ++i){
        temp.data[i] = this->data[i] * right; 
    }
    return temp;
}
 
Test &Test::operator=(const Test &right){
    if(this != &right){
        if(this->size!=right.size){
            delete [] this->data;
            this->size = right.size;
            this->data = new int[right.size];
        }
        for(int i = 0; i < size; ++i){
            this->data[i] = right.data[i]; 
        }
    }
    return *this;
}
 
Test::~Test(){
    delete [] this->data;
}
 
int main() {
 
    Test t(2);
    Test s(5);
 
    s = t*2;
 
 
    for(int i = 0; i < s.size; ++i){
    std::cout << s.data[i] << " ";
    }
 
    std::cin.get();
 
    return 0;
}
 
Текущее время: 22:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru