2014-04-01 135 views
-1

例如,我有一個MyClass類和兩個處理MyClass對象的類。如何使用unique_ptr或移動語義?

A類 - 創建MyClass;

B類 - 使用MyClass;

在A和B之間存儲和共享MyClass對象的正確方法是什麼?需要使用新運算符創建MyClass,並將指針存儲在unique_ptr中。或者執行移動c-tor,並創建MyClass作爲堆棧變量?

變體1:

class A 
{ 
    public : 
    unique_ptr<MyClass> mObj; 
}; 

class B 
{ 
    B(unique_ptr<MyClass> inObj) : mObj(inObj) {}; 
    public : 
    unique_ptr<MyClass> mObj; 
} 

變2:

class A 
{ 
    public : 
    MyClass mObj; 
}; 

class B 
{ 
    B(MyClass&& inObj) : mObj(inObj) {}; 
public : 
    MyClass mObj; 
}; 

使用:

A a; 
B(a.mObj); 
+0

我不認爲這是正確的答案。這真的取決於在堆上分配MyClass是否有意義。這可能取決於你的其他代碼。 – Benj

回答

0

在你的兩個例子中,類A不能在B接管後使用myObj!這可能不是你想要的。但如果它的目的是,我會推薦使用unique_ptr。這裏很明顯,如果當A已經失去了訪問myObj。您可以通過檢查myObj是否爲空指針來進行測試。

+0

是的,A不應該在將它傳遞給B後使用myObj。此外,即使在A被銷燬之後,也會使用myObj。在這種情況下,從理論上講,使用移動語義是一種好方法,或者更好地使用智能指針? – kaa

+1

在我看來,使用'unique_ptr'。通過使用移動語義,你必須注意'A :: myObj'中的xvalue已被正確處理。 – Danvil

-1

無論提出的解決方案是去上班,因爲兩者作爲成員變量,並與unique_ptr,你有兩個獨立的對象。

如果您需要訪問同一個對象,請使用std :: shared_ptr或使用引用。

隨着shared_ptr的:

class A 
{ 
    public : 

    A() : mpObj(new MyClass) {} 


    shared_ptr<MyClass> mpObj; 
}; 

class B 
{ 
public : 
    B(shared_ptr<MyClass> inObj) : mpObj(inObj) ; 

    shared_ptr<MyClass> mpObj; 
}; 

另一種選擇是使用引用:

class A 
{ 
    public : 

    A() : mpObj() {} 


    MyClass mpObj; 
}; 

class B 
{ 
public : 
    B(MyClass& inObj) : mpObj(inObj) ; 

    MyClass& mpObj; 
}; 

最重要的是說誰創建和初始化MyClass的對象。

另外,閱讀關於Dependency injection

+2

我假設OP放棄A並將MyClass的所有權轉移給B.我不認爲他需要這兩個類一次使用MyClass對象。 – Benj

+0

@Benj這就是我對這個問題的理解。這兩個類一次使用MyClass。 –