2010-11-23 8 views
8

Nur eine Frage. Mit Blick auf C++ Boost-Bibliotheken (insbesondere Boost :: Thread-Klasse) dachte ich: "Wie ist es möglich, eine Klasse zu erstellen, die Objekte definiert, die nicht kopiert werden können, aber von einer Funktion zurückgegeben werden können?"Nicht kopierbare, aber bewegliche Objekte in C++ erstellen

Nun dieses Beispiel betrachten, die boost :: Thread-Klasse verfügt über die Eigenschaften, die ich schon erwähnt, so ist es möglich, dies zu tun:

boost::thread make_thread(); 

void f() 
{ 
    boost::thread some_thread=make_thread(); 
    some_thread.join(); 
} 

Nun bedeutet dies, dass das Objekt boost :: Thread kann nicht kopiert werden , aber von einer Funktion zurückgegeben, ist dies möglich. Wie ist das möglich ????

Ich nehme an, dass ein Kopierkonstruktor nicht zur Verfügung gestellt werden muss, aber wie man mit der Rückkehr von einer Funktion fertig wird? braucht es keinen Kopierkonstruktor zu benutzen ???

Thankyou

Antwort

4

Dieser möglich sein wird, in C++ 1x, die Semantik über bewegen rvalue Referenzen zur Verfügung stellt. Mit diesem können Sie implementieren Bewegen und/oder Kopieren separatedly:

class my_class { 
    private: 
    data_t* data_; 
    public: 
    my_class(const my_class& rhs)  // copy constructor 
    : data_(rhs.data_.clone()) 
    {} 
    my_class(my_class&& rhs)   // move constructor 
    : data_(rhs.data_) 
    { 
     rhs.data_ = NULL; 
    } 
    ~my_class() {delete data_;}  // noop if data_==NULL 

    my_class& operator=(my_class rhs) // copy assignment 
    { 
     this->swap(rhs); 
    } 
    my_class& operator=(my_class&& rhs)// move assignment 
    { 
     this->swap(rhs); 
    } 

    // ... 
}; 

Kopieren und Verschieben kann separat verboten werden, so können Sie Setup-Klassen, die bewegt werden kann, aber nicht kopiert.

Natürlich gibt es ein paar magische Tricks, die Sie dies tun können, selbst wenn Ihr Compiler noch nicht bewegen Semantik unterstützen (std::auto_ptr, nachdem alle anstelle des Kopierens bewegt, wenn zugeordnet), so könnte dies für boost::thread arbeiten sogar in Abwesenheit von Bewegungssemantik.

+0

Was ist C++ 1x? Ich kann c1x und C++ 0x im Internet sehen, aber nicht C++ 1x. Ist es eine Abkürzung für beide? –

+1

@Alex - es ist klug-Esel sprechen für die Tatsache, dass es bereits 2010 ist und sie nicht veröffentlicht haben. Es gibt einen intelligenteren Zähler: 0x ist hexadezimal. –

+0

@Alex: Es hieß früher C++ 0x, weil es vor _ 2010 erwartet wurde, aber das hat nicht geklappt. Viele bleiben bei "C++ 0x", obwohl es wahrscheinlich als C++ 11 oder C++ 12 endet. – sbi

2

Dies ist ein fortgeschrittenes Thema von C++, wenn Sie dies in C++ 03 tun möchten. Ein Beispiel dafür finden Sie in Howard Hinnants Unique_ptr C++03 emulation.

Es funktioniert im Grunde durch missbrauchen mehrere subtile Regeln in C++ Overload-Resolution, insbesondere die Regel, dass nicht-const Referenzen auf rvalue Provisorien nicht binden können und dass nicht-const Konvertierungsfunktionen noch auf nicht-const Provisorien aufgerufen werden können. Sie können auch die auto_ptr-Methode verwenden, wie sie in C++ 03 verwendet wird, die jedoch von mehreren Gruppen unterbrochen wird, da auto_ptr Sie Variablen kopieren, aber Ressourcen aus dem kopierten Objekt stehlen können (andere Gruppen haben andere Meinungen) darüber).

Verwandte Themen