private/public sichtbarkeit und make_unique



  • ich steh grad aufm schlauch, wie kann ich das folgende fehlerfrei implementieren?

    #include <memory>
    
        class foo
        {
        	foo() noexcept = default;
    
        public:
        	foo(int){}
    
        	std::unique_ptr<foo> f() const
        	{
        		return std::make_unique<foo>();
        	}
        };
    
        int main() {
        	foo a{ 5 };
        	a.f();
        }
    

    das problem ist ja dass make_unique keinen zugriff auf den standard-ctor hat. ich könnte nun das objekt auf dem stack anlegen und dann in make_unique reinmoven, ist aber vermutlich mit overhead verbunden und sieht auch viel hässlicher aus. ausserdem wäre das etwas, was ich vermutlich verschlimmbessern würde, wenn ich den code nochmals durchlese, weil es unnötig aussieht. also ist es auch nicht sonderlich wartbar.

    gibt es keinen direkten weg?



  • friend std::unique_ptr<foo> std::make_unique<foo>(); ?



  • Caligulaminus schrieb:

    friend std::unique_ptr<foo> std::make_unique<foo>(); ?

    ist es garantiert, dass das funktioniert? kann die implementierung nicht einfach in make_unique eine andere funktion aufrufen, die dann wiederum den standardkonstruktor aufruft?



  • nein, es ist nicht garantiert, dass das funktioniert - du hast den grund schon selbst genannt.

    und nein, es gibt keine "einfache" methode, das zu ermöglichen. du wirst um zusätzliche helfer-klassen/funktionen nicht herumkommen, wenn du so etwas in der art implementieren willst. das hängt dann alleridngs auch wieder ein bisschen vom anwendungsfall ab.



  • Wobei make_unique jetzt keine sonderlich komplizierte Funktion ist und man es auch einfach explizit ausprogrammieren könnte. So oder so ein Einzeiler.



  • std::unique_ptr<foo> f() const 
            { 
                return std::unique_ptr<foo>(new foo{}); 
            }
    


  • ... 👍



  • Wow, ich hatte mich erst verlesen und dachte du wolltest einen automatischen Konvertierungsoperator in unique_ptr anbieten.
    Mir wurde kurzfristig etwas schlecht 😃


Log in to reply