Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
17 / 17 / 2
Регистрация: 29.10.2013
Сообщений: 269
1

Передача unique_ptr в конструктор другого класса

12.10.2018, 11:34. Показов 4907. Ответов 7

Author24 — интернет-сервис помощи студентам
Как нужно передать unique_ptr в конструктор др. класса?
есть такой код:

.h файл:
C++
1
2
3
4
5
6
class MainClass {
private:
shared_ptr<Camera> camera;
unique_ptr<MasterRender> masterRender;
...
}
.cpp :
C++
1
2
3
camera = make_unique<Camera>(some args);
...
masterRender =  make_unique<MasterRender>(camera, some args);
.h MasterRender'a:
C++
1
2
3
4
5
6
7
class MasterRender {
private:
unique_ptr<Camera> camera;
...
public:
MasterRender(unique_ptr<Camera>& _camera, some args);
}
.cpp:
C++
1
2
3
MasterRender::MasterRender(unique_ptr<Camera>& _camera, some args) {
    this->camera = make_unique<Camera>(_camera);
}
Этот код выдает ошибки:
Ошибка C2664 "Camera::Camera(const Camera &)": невозможно преобразовать аргумент 1 из "std::unique_ptr<Camera,std::default_delete<_Ty>>" в "const Camera &"

Ошибка C2664 "MasterRender::MasterRender(const MasterRender &)": невозможно преобразовать аргумент 1 из "Camera *" в "std::unique_ptr<Camera,std::default_delete<_Ty>> &"

В классе Camera никаких умных указателей нет. Ошибки находит в файле memory, в 1630 строку
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2018, 11:34
Ответы с готовыми решениями:

Конструктор класса не видит конструктор по умолчанию другого класса
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора...

Конструктор внутри класса, поля которого являются членами другого класса
Вот фрагмент кода. class Class_Figure { Class_Triangle tr1; Class_Circle cr1; public:...

Конструктор класса с инициализацией другого класса
error C2064: term does not evaluate to a function taking 6 arguments Так же при наведении на ...

Передача объектов другого класса в конструктор через params
Здравствуйте. В учебнике есть пример: класс Figure, класс Point. В зависимости от того, сколько...

7
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2018, 11:54 2
Цитата Сообщение от nublin1 Посмотреть сообщение
shared_ptr<Camera> camera;
Цитата Сообщение от nublin1 Посмотреть сообщение
this->camera = make_unique<Camera>(_camera);
вы - моральный человек?
с логикой дружите?

как вы вообще себе представляете присвоение смарта с уникальным владельцем
смарту, который шарит ресурсы?

Цитата Сообщение от nublin1 Посмотреть сообщение
unique_ptr<Camera>& _camera
я уникальный указатель! у меня может быть только один хозяин.
я это гарантирую.

Цитата Сообщение от nublin1 Посмотреть сообщение
this->camera
а я - шаристый указатель. у меня может быть множество хозяев.

Цитата Сообщение от nublin1 Посмотреть сообщение
this->camera = make_unique<Camera>(_camera);
ээээээ????????????? WHAT THE FUNK??????
0
17 / 17 / 2
Регистрация: 29.10.2013
Сообщений: 269
12.10.2018, 12:15  [ТС] 3
Цитата Сообщение от hoggy Посмотреть сообщение
Сообщение от nublin1
shared_ptr<Camera> camera;
замена на unique_ptr ничего не даёт.

И как тогда правильно всё таки передать unique_ptr? Дайте хотя бы ссылку как их использовать,.

Цитата Сообщение от hoggy Посмотреть сообщение
this->camera = make_unique<Camera>(_camera);
И что тут? распишите.
0
177 / 15 / 11
Регистрация: 05.12.2017
Сообщений: 131
12.10.2018, 12:15 4
nublin1, Думаю, вам стоит почитать про std::move(...), а после этого советую почитать, что такое move - конструктор.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2018, 12:20 5
Цитата Сообщение от nublin1 Посмотреть сообщение
Дайте хотя бы ссылку как их использовать,.
http://www.cplusplus.com/refer... nique_ptr/
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
12.10.2018, 12:22 6
Цитата Сообщение от nublin1 Посмотреть сообщение
C++
1
this->camera = make_unique<Camera>(_camera);
C++
1
this->camera = std::move(_camera);
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2018, 12:37 7
Лучший ответ Сообщение было отмечено nublin1 как решение

Решение

Цитата Сообщение от nublin1 Посмотреть сообщение
И что тут? распишите.

есть ресурс. Камера.

шаристый смарт (shared_ptr<Camera>) реализует стратегию:
"один ресурс, множество потребителей"

он позволяет расшаривать ресурс между множеством владельцев:

C++
1
2
3
4
5
6
7
8
shared_ptr<Camera> camera = createCamera(); // --- допустим создали камеру
 
// теперь можно расшаривать её на множество потребителей
shared_ptr<Camera> cam1 = camera;
shared_ptr<Camera> cam2 = camera;
 
// cam1 и cam2 - на самом деле владельцы одной и той же исходной камеры
// то есть, камера в программе всего одна. а вот владельцев несколько


юник (unique_ptr<Camera>) реализует стратегию:
"один хозяин для одного ресурса"

он гарантирует, что у ресурса может быть только 1 хозяин.

C++
1
2
3
4
unique_ptr<Camera> camera = createCamera(); // --- допустим создали ресурс
 
unique_ptr<Camera> cam1 = camera; // error
// нельзя так делать. у камеры может быть только один хозяин

для юников допустима передача права владения:

C++
1
2
3
4
5
6
unique_ptr<Camera> camera = createCamera(); // --- допустим создали ресурс
 
unique_ptr<Camera> cam1 = std::move(camera); // можно
// право владения перешло к cam1.
// camera теперь опусташённый смарт. больше не владеет камерой
// владелец у камеры в любом случае получается только один

так же, для юников допустимо клонирование
(глубокое копирование ресурса)

C++
1
2
3
4
5
6
unique_ptr<Camera> camera = createCamera(); // --- допустим создали ресурс
 
unique_ptr<Camera> cam1 =std::make_unique<Camera>(*camera); // можно
// cam1 и camera  - это два разных независимых ресурса
// которые контролируются двумя разными 
// несвязанными друг с другом смартами

возвращаясь к нашим баранам:


C++
1
this->camera = make_unique<Camera>(_camera);
во-первых, здесь попытка сделать юник на основе юника,
что в принципе запрещено:

default (1)
constexpr unique_ptr() noexcept;

from null pointer (2)
constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}

from pointer (3)
explicit unique_ptr (pointer p) noexcept;

from pointer + lvalue deleter (4)
unique_ptr (pointer p, typename conditional<is_reference<D>::value,D,const D&> del) noexcept;

from pointer + rvalue deleter (5)
unique_ptr (pointer p, typename remove_reference<D>::type&& del) noexcept;

move (6)
unique_ptr (unique_ptr&& x) noexcept;

move-cast (7)
template <class U, class E> unique_ptr (unique_ptr<U,E>&& x) noexcept;

move from auto_ptr (8)
template <class U> unique_ptr (auto_ptr<U>&& x) noexcept;

copy (deleted!) (9)
unique_ptr (const unique_ptr&) = delete;
оно и понятно. юник - уникальный хозяин для уникального ресурса.
он не должен копироваться, потому что наличие копии сделает его не уникальным,
что противоречит идее его существования.

а во-вторых, вы пытались присвоить шаристому указателю уник.
это как это по вашему получается?
уникальный указатель раздать куче различных потребителей?
налетай, подешевело? разбирай кто хочет?
1
17 / 17 / 2
Регистрация: 29.10.2013
Сообщений: 269
12.10.2018, 13:03  [ТС] 8
Отлично! Вот сейчас я всё понял. Кроме 1-го:
У меня есть объект camera, который я хочу исп. в множестве мест. Для этого я делаю его shared_ptr и отправляю, но в принимающих классах ему уже не надо быть доступным для всех. При этом его нельзя сделать unique . Или не беспокоится о этом?
0
12.10.2018, 13:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2018, 13:03
Помогаю со студенческими работами здесь

Передача управления из конструктора класса-родителя в конструктор класса-потомка
Здравствуйте. Возможно ли передать управление из конструктора класса-родителя в конструктор...

Передача названия класса в метод другого класса в качестве входных данных
У меня есть класс &quot;class1&quot;, от которого наследуется несколько однотипных классов classX, classY,...

Передача значения переменной из метода одного класса в метод другого класса
Добрый вечер! Есть основная форма Form1 в которой есть метод private void button1_Click(object...

Передача конструктору одного класса объект другого класса
Здравствуйте, кодеры. Столкнулся с проблемой. У меня есть 2 класса Camera и Game и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru