Ответ 1
Да, если вам нужно поддерживать назначение, то вместо указателя вместо него указывается указатель.
У меня есть класс, который хранит ссылку на родителя, эта ссылка передается в конструкторе. Если я попытаюсь скопировать экземпляр, я получу ошибку "ошибка C2582: функция" operator = "недоступна", предположительно, до того, что ссылка не назначается.
Есть ли способ обойти это или просто изменить переменную на указатель вместо ссылки?
например (более упрощенный, но я думаю, имеет ключевые моменты):
class MyClass
{
public:
MyClass(OtherClass &parent) : parent(parent) {}
private:
OtherClass &parent;
};
MyClass obj(*this);
.
.
.
obj = MyClass(*this);
Да, если вам нужно поддерживать назначение, то вместо указателя вместо него указывается указатель.
но если вы действительно задумались об этом:
#include <new>
MyClass::MyClass(const MyClass &rhs): parent(rhs.parent)
{
}
MyClass &MyClass::operator=(const MyClass &rhs)
{
if (this!=&rhs)
{
this->~MyClass();
new (this) MyClass(rhs);
}
return *this;
}
Есть способ сделать это и по-прежнему использовать ссылку, используйте reference_wrapper
. Так
T& member;
становится
std::reference_wrapper<T> member;
Справочные обертки в основном просто перенаправляемые ссылки.
Да, просто сделайте элемент указателем. Ссылка не сможет быть пересмотрена, а нет обхода.
Изменить: @ "Стив Джессоп" делает правильный вывод о том, как обходиться проблема с использованием идиомы PIMPL (частная реализация с использованием "d-pointer" ). В задании вы удаляете старую реализацию и создаете новую копию, созданную из d-указателя исходного объекта.
Вам необходимо реализовать конструктор копирования и инициализировать ссылку в этом конструкторе копирования, чтобы указать ту же ссылку, что и исходный объект.
Я бы сделал его boost:: shared_ptr. Вы можете быть довольно грубыми с ними, и они заботятся о себе. В то время как использование необработанного указателя означает, что вам нужно беспокоиться о том, что объект остается в живых