Подтвердить что ты не робот

Копирование класса С++ с переменной-членом ссылочного типа

У меня есть класс, который хранит ссылку на родителя, эта ссылка передается в конструкторе. Если я попытаюсь скопировать экземпляр, я получу ошибку "ошибка C2582: функция" operator = "недоступна", предположительно, до того, что ссылка не назначается.

Есть ли способ обойти это или просто изменить переменную на указатель вместо ссылки?

например (более упрощенный, но я думаю, имеет ключевые моменты):

class MyClass
{
public:
 MyClass(OtherClass &parent) : parent(parent) {}
private:
 OtherClass &parent;
};

MyClass obj(*this);
.
.
.
obj = MyClass(*this);
4b9b3361

Ответ 1

Да, если вам нужно поддерживать назначение, то вместо указателя вместо него указывается указатель.

Ответ 2

Я вообще этого не рекомендую

но если вы действительно задумались об этом:

#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;
}

Ответ 3

Есть способ сделать это и по-прежнему использовать ссылку, используйте reference_wrapper. Так

    T& member;

становится

    std::reference_wrapper<T> member;

Справочные обертки в основном просто перенаправляемые ссылки.

Ответ 4

Да, просто сделайте элемент указателем. Ссылка не сможет быть пересмотрена, а нет обхода.

Изменить: @ "Стив Джессоп" делает правильный вывод о том, как обходиться проблема с использованием идиомы PIMPL (частная реализация с использованием "d-pointer" ). В задании вы удаляете старую реализацию и создаете новую копию, созданную из d-указателя исходного объекта.

Ответ 5

Вам необходимо реализовать конструктор копирования и инициализировать ссылку в этом конструкторе копирования, чтобы указать ту же ссылку, что и исходный объект.

Ответ 6

Я бы сделал его boost:: shared_ptr. Вы можете быть довольно грубыми с ними, и они заботятся о себе. В то время как использование необработанного указателя означает, что вам нужно беспокоиться о том, что объект остается в живых