класс — c ++ Копировать конструкторы и деструкторы

Я изучаю конструкторы и деструкторы в C ++; Помоги мне понять мои ошибки, даже если они глупы …

Вот код, который я написал для выполнения сложения с использованием классов в c ++; Это создает два слагаемых тип данных Num и нанимает конструктор сумма () выполнить сумму двух чисел; Однако, когда все было хорошо, я наткнулся на создание конструктора копирования для num (хотя и не обязательно, но все же для практики) … без динамического объекта класса сумма невозможно выполнить код в любом случае (без удаления конструктора копирования) … Помогите мне улучшить мой код и мои ошибки в приведенном ниже коде; Также я хочу знать, как использовать конструктор копирования в этой программе; проблема в том, что в деструкторе операция удаления выполняется несколько раз на одном и том же фрагменте памяти (я полагаю)

Вот мой код

#include<iostream>
#include<new>
using namespace std;
class num
{
public:
int *a;
num(int x)
{
try
{
a=new int;
}
catch(bad_alloc xa)
{
cout<<"1";
exit(1);
}
*a=x;
}
num(){  }
num(const num &ob)
{
try
{
a=new int;
}
catch(bad_alloc xa)
{
cout<<"1''";
exit(2);
}
*a=*(ob.a);
}
~num()
{
cout<<"Destruct!!!";
delete a;
}
};class sum:public num
{
public:
int add;
sum(num n1,num n2)
{
add=*(n1.a)+*(n2.a);
}
int getsum()
{
return add;
}
};

int main()
{
num x=58;
num y=82;
sum *s=new sum(x,y);
cout<<s->getsum();
delete s;
return 0;
}

-2

Решение

Я могу что-то пропустить — не использовал new / delete слишком долго, но пытался исправить все, что заметил.

Постскриптум всегда используйте умные указатели.

#include <iostream>
#include <exception>
#include <new>

using namespace std;

int* allocate(const char* err_msg, int exit_code)
{
int* a = nullptr;
try
{
a = new int;
}
catch (bad_alloc&)
{
cout << err_msg << endl;
exit(exit_code);
}
return a;
}

class num
{
int* a = nullptr; // always should be initialized here

public:
num() noexcept : a(nullptr) // or here
{}

/*explicit*/ num(int x) : a(allocate("1", 1))
{
*a = x;
}

num(const num& ob) : a(allocate("1''", 2))
{
*a = *(ob.a);
}

// rule of zero/three/five
// default copy assignment will copy pointer and one int will be leaked and one will be deleted twice
num& operator =(const num& ob)
{
if (&ob == this)
{
return *this;
}

*a = *(ob.a);
return *this;
}

~num()
{
cout << "Destruct!!!";
delete a;
a = nullptr; // usefull for debug
}

int value() const
{
if (a == nullptr)
{
throw runtime_error("a == nullptr");
}
return *a;
}
};

class sum
{
int add = 0;

public:
sum(const num& n1, const num& n2)
{
add = n1.value() + n2.value();
}

int getsum() const
{
return add;
}
};

int main()
{
const num x = 58;
const num y = 82;
const sum* s = new sum(x, y);
cout << s->getsum() << endl;
delete s;
return 0;
}
0

Другие решения

Других решений пока нет …