Ваш первый конструктор может выглядеть так:
Pair::Pair(int a, int b)
: pa(new int(a))
, pb(new int(b))
{
}
И вам не нужно многократно писать сложный код, перенаправляя его в первый конструктор.
Pair::Pair(const Pair & other)
: Pair(*other.pa, *other.pb)
{
}
Другая вещьявляется то, что вы также должны реализовать оператор присваивания. В противном случае ваш код будет очень подвержен ошибкам, если вы случайно сделаете присваивание (как если бы вы имели двойное значение delete
, предполагая, что ваш деструктор правильно реализован.
Сказав это, ваш деструктор должен быть:
Pair::~Pair()
{
delete pa;
delete pb;
}
Как уже говорили другие, было бы проще напрямую использовать int
для членов, поскольку вам не пришлось бы определять копирование и присваивание самостоятельно.
// Inside class declaration
Pair &operator=(const Pair &other);
// With other definitions.
Pair &Pair::operator=(const Pair &other)
{
*pa = *other.pa;
*pb = *other.pb;
return *this;
}
Если вам действительно нужны указатели, тогда я бы порекомендовал вам использовать std::unique_ptr
.
В вашем классе объявление становится std::unique_ptr<int> pa;
и похоже на pb
. В этот момент ваш деструктор станет пустым. Оставшийся код может остаться прежним.
Также предпочтительно избегать создания переменной-члена public
и даже больше в случае, подобном этому, когда у вас динамически выделяется память.