Возможно, я пытался быть слишком общим. (Исходный вопрос ниже) Конкретно, у меня есть некоторая зависимость Dep
от класса Foo
. У меня также есть класс MockDep
, и я определяю класс TestFoo
. Вот его конструктор, который я пытался написать:
TestFoo(unique_ptr<MockDep> dep) : Foo(std::move(dep)), mock_dep_(dep.get()) {}
И конструктор Foo
выглядит так:
Foo(unique_ptr<Dep> dep) : dep_(dep) {}
mock_dep_
объявляется в TestFoo
как MockDep* mock_dep_
, а dep_
объявляется в Foo
как unique_ptr<Dep> dep_
. Как я могу заставить mock_dep_
содержать адрес dep_
? (поскольку вышеприведенное не работает, поскольку std::move(dep)
обнуляет dep
.)
Исходное сообщение:
У меня есть объект типа Foo
, который я должен передать другому объекту типа OtherObject
, который утверждает, что владеет им, но как указатель на его базовый класс. Однако я хочу получить указатель на дочерний объект, который я могу использовать для ссылки на него. Я написал что-то вроде:
Foo(std::unique_ptr<Child> thing) :
OtherObject(std::move(thing)), child_(thing.get()) {}
OtherObject(std::unique_ptr<Base> thing, ...) { ... }
Однако это, похоже, не работает, так как std::move(thing)
, кажется, обнуляет указатель, который позже возвращается из thing.get()
.
Я могу изменить параметр Foo
, чтобы он имел тип Child*
вместо unique_ptr<Child>
, но я бы предпочел иметь возможность сделать последнее, поскольку он явно документирует семантику владения.
Каков наиболее подходящий (или, если это не так, ненавязчивый) способ решить эту проблему?
изменить: Foo
и OtherObject
предназначены для классов, конструкторы которых я определяю.
OtherObject
? Насколько я знаю, это не может быть функцией в этом контексте. - person Shoe   schedule 10.06.2014