Как использовать ссылку в содержащемся объекте?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать ссылку в содержащемся объекте?

Сообщение Anonymous »

У меня есть объект коллекции MySet, переменная-член которого m_objects определена как std::vector m_objects.
Мне нужно, чтобы мой класс MyObject имел ссылку на экземпляр MySet, владеющий им, примерно так:

Код: Выделить всё

class MySet;

class MyObject
{
public:

...

private:
MySet &m_owner;

...

};
Для вызова таких функций, как Erase() и emplace() в m_objects, требуются конструкторы перемещения и операторы присваивания копирования в MyObject. С конструктором перемещения все в порядке, но я не могу понять, как скопировать ссылку m_owner в операторе копирования.
В настоящее время я перехожу на использование указателя вместо ссылки, но это не идеально.
Можно ли скопировать и назначить ссылку, как это? Если да, то как?
-------------------------------------
Для справки, ошибка компиляции, которую я получаю без конструктора копирования:

Код: Выделить всё

/x86_64-unknown-linux-gnu/include/c++/v1/__algorithm/move.h:42:17: error: object of type 'Object' cannot be assigned because its copy assignment operator is implicitly deleted
42 |       *__result = _IterOps::__iter_move(__first);
|                 ^
/x86_64-unknown-linux-gnu/include/c++/v1/__algorithm/copy_move_common.h:109:19: note: in instantiation of function template specialization 'std::__move_loop::operator()' requested here
109 |   auto __result = _Algorithm()(std::move(__range.first), std::move(__range.second), std::__unwrap_iter(__out_first));
|                   ^
/x86_64-unknown-linux-gnu/include/c++/v1/__algorithm/copy_move_common.h:133:15: note: in instantiation of function template specialization 'std::__unwrap_and_dispatch' requested here
133 |   return std::__unwrap_and_dispatch(std::move(__first), std::move(__last), std::move(__out_first));
|               ^
/x86_64-unknown-linux-gnu/include/c++/v1/__algorithm/move.h:112:15: note: in instantiation of function template specialization 'std::__dispatch_copy_or_move' requested here
112 |   return std::__dispatch_copy_or_move(
|               ^
/x86_64-unknown-linux-gnu/include/c++/v1/__algorithm/move.h:122:15: note: in instantiation of function template specialization 'std::__move' requested here
122 |   return std::__move(std::move(__first), std::move(__last), std::move(__result)).second;
|               ^
/x86_64-unknown-linux-gnu/include/c++/v1/vector:1532:32: note: in instantiation of function template specialization 'std::move' requested here
1532 |   this->__destruct_at_end(std::move(__p + 1, this->__end_, __p));
|                                ^
my_set.cpp:92:24: note: in instantiation of member function 'std::vector::erase' requested here
92 |             m_objects.erase(it);
|                        ^
object.h:45:9: note: copy assignment operator is implicitly deleted because 'Object' has a user-declared move constructor
45 |         Object(Object &&other);
|         ^
После перехода на указатель вместо ссылки мне кажется, что мне больше не нужен ни конструктор перемещения, ни оператор копирования-присваивания. При использовании ссылки вместо указателя я получаю следующую ошибку:

Код: Выделить всё

/x86_64-unknown-linux-gnu/include/c++/v1/__algorithm/move.h:42:17: error: object of type 'Object' cannot be assigned because its copy assignment operator is implicitly deleted
Я предполагаю, что наличие ссылки в качестве переменной-члена автоматически неявно удаляет оператор копирования. Поскольку ссылка - это всего лишь указатель "под капотом" я не понимаю, зачем это нужно. Если ссылка действительна для копируемого объекта, она должна быть действительна и для копируемого объекта.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ned-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»