Vielleicht habe ich versucht, zu allgemein zu sein. (Original Frage unten) Konkret habe ich eine Abhängigkeit Dep
einer Klasse Foo
. Ich habe auch eine Klasse MockDep
und definiere eine Klasse TestFoo
. Hier ist Konstruktor Ich habe versucht zu schreiben:unique_ptr Besitz Semantik
TestFoo(unique_ptr<MockDep> dep) : Foo(std::move(dep)), mock_dep_(dep.get()) {}
Und Foo
‚s Konstruktor wie folgt aussieht:
Foo(unique_ptr<Dep> dep) : dep_(dep) {}
mock_dep_
in TestFoo
als MockDep* mock_dep_
delcared ist und dep_
wird in Foo
als unique_ptr<Dep> dep_
erklärt. Wie kann ich mock_dep_
erhalten, um die Adresse dep_
zu enthalten? (Wie die oben nicht funktioniert, da std::move(dep)
nulls aus dep
.)
Original-Beitrag:
Ich habe ein Objekt vom Typ Foo
, dass ich zu einem anderen Objekt des Typs passieren OtherObject
, die Eigentümerschaft davon beansprucht, aber als Zeiger auf seine Basisklasse. Ich möchte jedoch einen Zeiger auf das untergeordnete Objekt abrufen, mit dem ich darauf verweisen kann. Ich schrieb so etwas wie:
Foo(std::unique_ptr<Child> thing) :
OtherObject(std::move(thing)), child_(thing.get()) {}
OtherObject(std::unique_ptr<Base> thing, ...) { ... }
Allerdings bedeutet dies nicht zu funktionieren scheint, wie der std::move(thing)
den Zeiger auf Null zu bringen scheint, die später von thing.get()
zurückgibt.
Ich kann Foo
's Parameter ändern, um vom Typ Child*
anstelle von unique_ptr<Child>
zu sein, aber ich würde es vorziehen, Letzteres zu tun, da es die Eigentumssemantik ausdrücklich dokumentiert.
Was ist die am besten geeignete (oder fehlschlagende, unaufdringliche) Möglichkeit, dies zu lösen?
bearbeiten: Foo
und OtherObject
sollen beide Klassen sein, deren Konstrukteure ich definieren.
Was ist 'OtherObject'? AFAIK kann es in diesem Zusammenhang keine Funktion sein. – Shoe
@Jefffrey mein schlechter, nachbearbeiteter – Alec
@ Jeffrey Ich bin mir nicht sicher, welche Verwirrung bleibt - ich schrieb den Beitrag um, um direkter auf mein Problem zu verweisen. – Alec