Я пытаюсь реализовать копирование при записи, используя указатель на целое число. Но я не понимаю, как писать код. Идея очень ясна в моей голове: когда я использую конструктор по умолчанию, я создаю новый экземпляр объекта (количество экземпляров = 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, даже если я создаю копию объекта с помощью конструктора копирования.
Ваш конструктор по умолчанию должен создать новый счетчик ссылок:
ref(new int(1))
И ваш конструктор копирования должен сделать так, чтобы новый объект заканчивался указателем на счетчик ссылок исходного объекта и увеличивал его (что вы уже делаете):
ref(rhs.ref)
У меня проблемы с пониманием того, что вы хотите, но я постараюсь …
Я создаю 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