2016-04-30 5 views
1

Ich versuche Arrays mit unique_ptr ohne Erfolg zu verwenden.
Was ist der richtige Weg, ein unique_ptr einiger Größe zu deklarieren?
(Größe ist etwas Parameter).C++ unique_ptr und Arrays

unique_ptr<A[]> ptr = make_unique<A[]>(size); 

Hier ist ein Beispiel:

#include <iostream> 
#include <string> 
#include <vector> 
#include <functional> 
#include <memory> 

using namespace std; 

class A { 
    string str; 
public: 
    A(string _str): str(_str) {} 
    string getStr() { 
     return str; 
    } 
}; 

int main() 
{ 
    unique_ptr<A[]> ptr = make_unique<A[]>(3); 
} 

Dies ist jedoch nicht funktioniert, wenn ich den Konstruktor von A löschen, es funktioniert.
Ich möchte die 3 die Größe des Arrays darstellen, und kein Argument für A's Konstruktor, wie mache ich das?

+0

Hint arbeiten: Verwenden Sie 4 Leerzeichen Einrückung Text als Code – Drop

+1

markieren Warum nicht mit 'std :: unique_ptr > ptr = make_unique > (3);'? –

+0

oder alternativ 'std :: unique_ptr > ptr = make_unique >();' –

Antwort

1

Dies funktioniert nicht, aber wenn ich den Konstruktor von A lösche, funktioniert es funktioniert.

Wenn Sie den benutzerdefinierten Konstruktor entfernt haben, generiert der Compiler implizit einen Standardkonstruktor. Wenn Sie einen benutzerdefinierten Konstruktor bereitstellen, generiert der Compiler nicht implizit einen Standardkonstruktor.

std::make_unique<T[]> erfordert die Verwendung von Standardkonstruktoren ...

ein So bieten, und alle sollten gut

#include <iostream> 
#include <string> 
#include <vector> 
#include <functional> 
#include <memory> 

using namespace std; 

class A { 
    string str; 
public: 
    A() = default; 
    A(string _str): str(_str) {} 
    string getStr() { 
     return str; 
    } 
}; 

int main() 
{ 
    unique_ptr<A[]> ptr = make_unique<A[]>(3); 
} 
+0

In diesem Fall symbolisiert die 3 die Größe von ptr? I.e., ptr enthält jetzt 3 Zeiger? – user5618793

+1

@ user5618793 Dies ist die Antwort; Falls Sie es nicht bemerkt haben, gibt es einen implizit definierten Standardkonstruktor, wenn in Ihrer Klasse keine anderen Konstruktoren vorhanden sind. Aus diesem Grund funktioniert Ihr Code, wenn Sie den benutzerdefinierten Konstruktor auskommentieren. –

+0

@bku_drytt Ich weiß, dass ich einfach nicht die Verwendung von 'A()' <- leerer Konstruktor in meinem Code, so dass ich den Fehler nicht verstehen – user5618793