Я не могу понять это. Похоже, я пропустил что-то простое? Что я положил в MakePointToSameValue
таким образом, что в точке (1)
Как сделать все копии shared_ptr равными другому shared_ptr?
- как b.ptr и c.ptr указывают на то же самое, как a.ptr
- другими словами,
a.ptr.get() == b.ptr.get() == c.ptr.get()
- значение первоначально указал по b.ptr и c.ptr удаляется
?
struct Test
{
public:
Test(int val) :
ptr(std::make_shared<int>(val))
{
}
void MakePointToSameValue(Test& other)
{
//what do I put here?
//other.ptr = this->ptr; //doesn't do it
}
private:
std::shared_ptr<int> ptr;
};
Test a(0);
Test b(5);
Test c(b);
b.MakePointToSameValue(a);
//(1)
Копирование PTR не работает, так как он не изменяет с (ну, c.ptr имеет это RefCount уменьшается на единицу). Обратите внимание, что я использую int
только для упрощения, но он должен работать для не подлежащих копированию типов.
Почему? У меня есть класс, представляющий значения, любые типы значений, для использования в каком-то компиляторе. Фактическое значение, а также то, как оно хранится, известно, когда оно создается. Единственное, что известно, это тип. Таким образом, класс хранит shared_ptr, содержащий местозаполнитель для значения, определенного позже (соответствует компиляции аргументов определения функции при передаче как указателя или ссылки: компилятор знает только тип, не более того). Во время выполнения местозаполнитель должен быть заменен фактическим значением.
Редактировать свежее начало дня, придумал это. Я знал, что это просто.
void MakePointToSameValue(Test& other)
{
other.ptr.swap(ptr);
ptr.reset();
ptr = other.ptr;
}
Дополнительный вопрос: есть ли работа над тем, что ожидается для любого стандартного совместимого указателя?
Для чего именно? –
Похоже, вам нужны два уровня косвенности. –
@CatPlusPlus см. Последний абзац – stijn