Если честно, у меня такое чувство, что реальная проблема в том, что вы не до конца понимаете разницу между мелкой копией и глубокой копией в c ++.
В очень простых терминах: мелкая копия = копировать указатель, глубокая копия = копировать то, на что указывает указатель.
Ваш код представляет собой вариант глубокой копии, принимая то, на что указывает указатель, исоздайте новый экземпляр из этого (при условии, что он скомпилируется).
Я приведу простой пример, а остальное оставлю вам:
#include <iostream>
struct foo {
int * some_pointer;
void deep_copy( const foo& other) {
// copy the value
*some_pointer = *(other.some_pointer);
}
void shallow_copy( const foo& other) {
// make some_pointer point to the same as other.some_pointer
some_pointer = other.some_pointer;
}
};
int main() {
int x = 0;
int y = 42;
foo f{&x};
foo g{&y};
f.deep_copy(g);
y = 3;
std::cout << *f.some_pointer << "\n";
std::cout << *g.some_pointer << "\n";
f.shallow_copy(g);
y = 5;
std::cout << *f.some_pointer << "\n";
std::cout << *g.some_pointer << "\n";
}
Это напечатает:
42
3
5
5
Поскольку сначала f.deep_copy(g);
копирует значение ивпоследствии изменение значения y
(которое изначально было связано с g
) не влияет на f
.
С другой стороны, после f.shallow_copy(g);
оба f.some_pointer
и g.some_pointer
обауказывает на y
, следовательно, изменение y
отражается как на f
, так и g
.