相关疑难解决方法(0)

如何将unique_ptr参数传递给构造函数或函数?

我是新手在C++ 11中移动语义,我不太清楚如何处理unique_ptr构造函数或函数中的参数.考虑这个引用自身的类:

#include <memory>

class Base
{
  public:

    typedef unique_ptr<Base> UPtr;

    Base(){}
    Base(Base::UPtr n):next(std::move(n)){}

    virtual ~Base(){}

    void setNext(Base::UPtr n)
    {
      next = std::move(n);
    }

  protected :

    Base::UPtr next;

};
Run Code Online (Sandbox Code Playgroud)

这是我应该如何编写unique_ptr参数的函数?

我需要std::move在调用代码中使用吗?

Base::UPtr b1;
Base::UPtr b2(new Base());

b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
Run Code Online (Sandbox Code Playgroud)

c++ arguments unique-ptr c++11

377
推荐指数
5
解决办法
15万
查看次数

将std :: unique_ptr <Derived>转换为std :: unique_ptr <Base>

假设我有处理基类和派生类的工厂函数:

#include <memory>

using namespace std;

struct B { virtual ~B() {} };
struct D : B {};

unique_ptr<B> MakeB()
{
    auto b = unique_ptr<B>( new B() );
    return b; // Ok!
}

unique_ptr<B> MakeD()
{
    auto d = unique_ptr<D>( new D() );
    return d; // Doh!
}
Run Code Online (Sandbox Code Playgroud)

在上面的最后一行,我需要move(d)为了使它工作,否则我得到"错误:无效转换std::unique_ptr<D>std::unique_ptr<D>&&." 我的直觉说,在这种情况下,编译器应该知道它可以隐式地创建d一个rvalue并将其移动到基指针中,但事实并非如此.

这在我的编译器(gcc 4.8.1和VS2012)中是不可靠的吗?预期的设计unique_ptr?标准有缺陷吗?

c++ unique-ptr c++11 c++14

41
推荐指数
1
解决办法
9057
查看次数

将派生类的unique_ptr添加到基类unique_ptr的向量中

我有一个unique_ptr,我想添加到vector>.

unique_ptr<Derived> derivedObject;
vector<unique_ptr<Base>> vec;

vec.push_back(derivedObject) // Invalid arguments
Run Code Online (Sandbox Code Playgroud)

c++ inheritance vector unique-ptr move-semantics

5
推荐指数
2
解决办法
1820
查看次数

将导出的 std::unique_ptr 转换为基类并将所有权作为参数传递

我有这个代码:

#include <iostream>
#include <memory>

class Base
{
public:
    virtual void doSmth() = 0;
};

class Der1 : Base
{
public:
    void doSmth() final
    {
        std::cout << "Hello from der1\n";
    }
};

class Der2 : Base
{
public:
    void doSmth() final
    {
        std::cout << "Hello from der2\n";
    }
};

class Owner
{
public:
    Owner(std::unique_ptr<Base> passedptr)
    {
        ptr = std::move(passedptr);
    }

    std::unique_ptr<Base> ptr;
};

int main()
{
    auto der = std::make_unique<Der1>();
    Owner owner(std::move(der)); // Fails, need to convert
    owner.ptr->doSmth();
}
Run Code Online (Sandbox Code Playgroud)

我希望该类 …

c++ inheritance smart-pointers unique-ptr

2
推荐指数
1
解决办法
78
查看次数