什么用unique_ptr或移动语义?

时间:2014-04-01 12:33:32

标签: c++11

例如,我有一个MyClass类和另外两个处理MyClass对象的类。

A类 - 创建MyClass;

B类 - 使用MyClass;

在A和B中存储和共享MyClass对象的正确方法是什么。需要使用 new 运算符创建MyClass并将指针存储在unique_ptr中。或者实现 move 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 );

2 个答案:

答案 0 :(得分:0)

A接管之后,您的两个示例中的B类都无法使用myObj!这可能不是你的意思。但是,如果是这样,我建议使用unique_ptr。很明显,A是否以及何时失去对myObj的访问权限。您可以通过检查myObj是否为空指针来测试是否为。

答案 1 :(得分:-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

相关问题