Kann std :: make_unique mit der abstrakten Schnittstelle verwendet werden?

8

Betrachten Sie die folgende Codezeile:

%Vor%

Wie kann das mit der neuen Funktion std :: make_unique geschrieben werden, die von VS 2013 unterstützt wird? Ist es überhaupt möglich? *

* Mein Problem ist, dass ich nicht weiß, wie man 'make_unique' sagen soll, welche Art von Objekt instanziiert werden soll. Da nur die Parameter des Konstruktors übergeben werden, scheint es keine Kontrolle darüber zu geben ...

    
Boris 14.10.2014, 07:53
quelle

2 Antworten

12

Ja, Sie können natürlich make_unique dafür verwenden, aber es ist nicht so nützlich, wie Sie vielleicht möchten. Sie haben folgende Möglichkeiten:

%Vor%

Ich würde sagen, die wahre Frage ist: "Warum willst du das?"

  1. Im Gegensatz zu make_shared hat make_unique keine Zuweisungsvorteile gegenüber new . Wenn Sie also die Kontrolle über den Typ des Zeigers benötigen, ist es gut, was Sie tun.

  2. Warum müssen Sie den Zeiger zuerst in IGpsSource eingeben? Eine implizite Konvertierung von std::unique_ptr<Derived> rvalues ​​ nach std::unique_ptr<Base> rvalues ​​existiert. Wenn Sie also make_unique aufrufen, um einen IGpsSource -Zeiger zu initialisieren, funktioniert das problemlos. Und wenn du den Zeiger irgendwohin transferieren willst, musst du std::move auf jeden Fall machen, dann kann die Konvertierung wieder passieren.

Angew 14.10.2014, 07:57
quelle
0
%Vor% Wie Angew gesagt hat, sollte das obige gut funktionieren. Bereitgestellt Derived verwendet die öffentliche Vererbung. Ich wollte das nur der Vollständigkeit halber hinzufügen.

    
Ajmal Kunnummal 02.04.2018 22:43
quelle

Tags und Links