2016-07-31 20 views
-1

Ich habe Klasse:Design-Muster für Methoden, die Objekt und NRVO Rückkehr

class A{ 
public: 
    A(int v){ 
     this->v=new int; 
     *(this->v)=v; 
    } 
    ~A(){ 
     delete v; 
    } 
    A add(A &a, A &b){ 
     A res(0); 
     *(res.v)=*(a.v)+*(b.v)+*v; 
     return res; 
    } 
    int get(){ 
     return *v; 
    } 
private:  
    A(); 
    int* v;  
    void operator=(const A &other); 
    TreePointer(const A &other); 
}; 

Ich möchte es wie folgt verwenden:

A finalRes=a.add(b,c).add(a,a); 

Es funktioniert perfekt, es gibt keine jede Speicherlecks. Aber wie implementiert man ein ähnliches Verhalten und Verwendung, ohne NRVO-Optimierung zu verwenden? Welche Standarddesignmuster existieren für diesen Zweck?

+4

Folgen Regel von 3/5/0. – Jarod42

+1

"* Es funktioniert perfekt, es gibt keine Lecks Speicher. *" Es ist sicher defekt; Ihr Verstoß gegen die Regel 5 stellt sicher, dass Speicher verloren geht. Oh sicher, Kopie Elision kann dich retten, aber das ist eine * Optimierung *, keine Voraussetzung. Es ist immer noch kaputt, selbst wenn es dir gelang, damit durchzukommen. –

Antwort

0

Vermeiden Sie new, bevorzugen Sie stattdessen std::unique_ptr.

In Ihrem Fall in der Tat, Sie brauchen nicht einmal Zeiger:

class A{ 
public: 
    explicit A(int v) : v(v){} 
    ~A() = default; 
    void operator=(const A &) = default; 
    A(const A &) = default; 
    A add(const A& a, const A& b) const { return A{v + a.v + b.v}; } 
    int get() const { return v; } 
private: 
    int v; 
};