копировать при записи, используя указатель на целое число

Я пытаюсь реализовать копирование при записи, используя указатель на целое число. Но я не понимаю, как писать код. Идея очень ясна в моей голове: когда я использую конструктор по умолчанию, я создаю новый экземпляр объекта (количество экземпляров = 1), а когда я использую конструктор копирования, я увеличиваю количество экземпляров и делаю поверхностную копию объекта.

    class Myclass
{
public:
Myclass(const char * foo, int foo2) : foo(foo), foo2(foo2)
{
(*ref)=1;
}
Myclass(const Myclass& rhs) :foo(rhs.foo),foo2(rhs.foo2)
{
(*ref)++;
}
const char * foo;
int foo2;
int *ref;
};

Я начинаю с C ++, и понятие указателя для меня совершенно новость, поэтому я попробовал это.
Но я действительно не понимаю, почему «ref» по-прежнему равен 1, даже если я создаю копию объекта с помощью конструктора копирования.

0

Решение

Ваш конструктор по умолчанию должен создать новый счетчик ссылок:

ref(new int(1))

И ваш конструктор копирования должен сделать так, чтобы новый объект заканчивался указателем на счетчик ссылок исходного объекта и увеличивал его (что вы уже делаете):

ref(rhs.ref)
0

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

У меня проблемы с пониманием того, что вы хотите, но я постараюсь …

Я создаю Myclass foo («foo», 10), а затем Myclass foo2 (foo). я хочу
все ссылки должны быть равны 2
. Здесь только ссылка на foo2 равна 2.
Ссылка на foo равна 1. Думаю, мне нужен указатель, нет?

Это можно сделать с помощью статической переменной:

class Myclass
{
public:
Myclass(const char * foo, int foo2) : foo(foo), foo2(foo2)
{
ref += 1;
if (1 == ref) {}    // First ref, do something?
}
Myclass(const Myclass& rhs) :foo(rhs.foo),foo2(rhs.foo2)
{
ref += 1;
}
~Myclass()           // Decrement on delete
{
ref -= 1;
if (0 == ref) {} // Last reference. Do something?
}
const char * foo;
int foo2;
static int ref;
};
int Myclass::ref = 0;   // Initialize to 0

Затем….

Myclass foo("foo",10);             // ref becomes 1
Myclass foo2(foo);                 // ref becomes 2
Myclass *foo3 = new Myclass(foo);  // ref becomes 3
delete foo3;                       // ref becomes 2
0

По вопросам рекламы [email protected]