2014-04-01 92 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。 –