2015-07-01 94 views
2

我需要从具有带一个参数的构造函数的类创建一个std::unique_ptr。我找不到有关如何操作的参考资料。这里是不能编译的代码示例:C++如何从构造函数上需要参数的类创建std :: unique_ptr

#include <iostream> 
#include <string> 
#include <sstream> 
#include <memory> 

class MyClass { 

    public: 
     MyClass(std::string name); 
     virtual ~MyClass(); 

    private: 
     std::string myName; 
}; 

MyClass::MyClass(std::string name) : myName(name) {} 
MyClass::~MyClass() {} 

class OtherClass { 

    public: 
     OtherClass(); 
     virtual ~OtherClass(); 

     void MyFunction(std::string data); 

     std::unique_ptr<MyClass> theClassPtr; 
}; 

OtherClass::OtherClass() {} 
OtherClass::~OtherClass() {} 

void OtherClass::MyFunction(std::string data) 
{ 
    std::unique_ptr<MyClass> test(data); <---------- PROBLEM HERE! 
    theClassPtr = std::move(test); 
} 

int main() 
{ 
    OtherClass test; 
    test.MyFunction("This is a test"); 
} 

的错误的方式有关I'm初始化std::unique_ptr,在我的代码中指出。

原始码和错误可以在here找到。

感谢您帮助我解决这个问题。

+0

使用'std :: make_unique',它将参数转发给构造函数。 –

+0

我试过了,但是我不能编译它...... seens认为std :: make_unique在C++ 11上不受支持...... – Mendes

+0

你能显示没有用的代码吗? –

回答

3

你可以这样做:

std::unique_ptr<MyClass> test(new MyClass(data)); 

或者,如果你有C++14

auto test = std::make_unique<MyClass>(data); 

但是:

在所提供的例子,没有必要创建一个临时变量,你可以使用类成员的reset方法:

theClassPtr.reset(new MyClass(data)); 
+0

或者,您可以简单地删除'test'变量,然后使用'theClassPtr.reset(new MyClass(data));'来代替。 –

+0

@RemyLebeau谢谢你,我忘记了原来的问题,谢谢你指出。现在修复。 – Galik

1
#include <memory> 
... 

int main() 
{ 
    std::string testString{ "Testing 1...2....3" }; 
    auto test = std::make_unique<MyClass>(testString); 
    return 0; 
} 
1

它基本上是一个疏忽。您需要:

#include <memory> 

namespace std 
{ 

    template <class T, class... Args> 
    std::unique_ptr <T> make_unique (Args&&... args) 
    { 
     return std::unique_ptr <T> (new T (std::forward <Args> (args)...)); 
    } 
} 
+0

将函数添加到std是非法的。把它放在'notstd'中。 – Yakk

+0

如果它是非法的,那么每个C++标准都是非法的。 –

+0

@DavidSchwartz:也许你的意思是“每个C++标准*库实现*都是非法的”? –

0

C++ 14自带std::make_unique。它在C++ 11中被省略了。

写它自己很容易:

namespace notstd{ 
    template<class T,class...Args> 
    std::unique_ptr<T> make_unique(Args&&...args){ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
    } 
} 

现在这样使用它:

auto foo = notstd::make_unique<MyClass>(string); 

会让你的独特PTR你。

这种模式有几个优点。首先,它会从“用户代码”中删除与delete没有配对的new,这让我很开心。其次,如果您调用一个需要2个不可识别的ptrs的函数,那么在抛出异常的情况下,上述可以避免泄漏。

因为向std注入新功能,所以在notstd中加入了这个标准(不需要诊断)。

相关问题