在header中声明智能指针时,如何将原始指针转换为智能指针?
How to convert raw to smart pointer when smart pointer is declared in header?
在我们的代码中,我们主要使用原始指针,我想逐步介绍智能指针(即不改变现有功能)。我们有一个工厂 returns 指向已创建 object 的指针。 class 中的几个方法使用此 object,因此指向创建的 object 的指针被声明为 class 成员。
std::unique_ptr<IObject> object;
现在,我想用智能指针替换原始指针。
我发现我可以将原始指针传递给智能指针的构造函数(在我的例子中我认为 unique_ptr 是正确的)但是因为智能指针是在 header 这是行不通的。
我尝试使用
object = make_unique<IObject>(CreateObject(1));
但这会产生编译错误,因为 IObject 是抽象的。
我能找到的唯一解决方案是创建一个临时 unique_ptr 然后使用 move.
//Factory.h
std::unique_ptr<IObject> object;
//Factory.cpp
IObject* ObjectFactory::CreateObject(int type)
{
switch( type )
{
case 1:
return new A();
case 2:
return new B();
}
}
//My solution is:
object = std::move( std::unique_ptr<IObject>(ObjectFactory::CreateObject(1)) );
我想知道是否有比创建临时智能指针然后使用 move 转移所有权更好的方法。
您可以使用 reset
唯一指针的成员函数将 Iobject
对象类型设置为您工厂的原始指针。
//Factory.h
std::unique_ptr<IObject> object;
//Factory.cpp
IObject* ObjectFactory::CreateObject(int type)
{
switch( type )
{
case 1:
return new A();
case 2:
return new B();
}
}
//use reset
object.reset(ObjectFactory::CreateObject(1));
这是一个最小的工作示例。
#include <iostream>
#include <memory>
class Abs {
public:
virtual ~Abs() = 0;
};
Abs::~Abs(){ std::cout << "called\n"; }
class A: public Abs {};
class B: public Abs {};
Abs* Factory(int type)
{
switch(type)
{
case 1:
new A();
break;
case 2:
new B();
break;
}
}
int main()
{
std::unique_ptr<Abs> obj;
obj.reset(Factory(1));
return 0;
}
在我们的代码中,我们主要使用原始指针,我想逐步介绍智能指针(即不改变现有功能)。我们有一个工厂 returns 指向已创建 object 的指针。 class 中的几个方法使用此 object,因此指向创建的 object 的指针被声明为 class 成员。
std::unique_ptr<IObject> object;
现在,我想用智能指针替换原始指针。
我发现我可以将原始指针传递给智能指针的构造函数(在我的例子中我认为 unique_ptr 是正确的)但是因为智能指针是在 header 这是行不通的。 我尝试使用
object = make_unique<IObject>(CreateObject(1));
但这会产生编译错误,因为 IObject 是抽象的。 我能找到的唯一解决方案是创建一个临时 unique_ptr 然后使用 move.
//Factory.h
std::unique_ptr<IObject> object;
//Factory.cpp
IObject* ObjectFactory::CreateObject(int type)
{
switch( type )
{
case 1:
return new A();
case 2:
return new B();
}
}
//My solution is:
object = std::move( std::unique_ptr<IObject>(ObjectFactory::CreateObject(1)) );
我想知道是否有比创建临时智能指针然后使用 move 转移所有权更好的方法。
您可以使用 reset
唯一指针的成员函数将 Iobject
对象类型设置为您工厂的原始指针。
//Factory.h
std::unique_ptr<IObject> object;
//Factory.cpp
IObject* ObjectFactory::CreateObject(int type)
{
switch( type )
{
case 1:
return new A();
case 2:
return new B();
}
}
//use reset
object.reset(ObjectFactory::CreateObject(1));
这是一个最小的工作示例。
#include <iostream>
#include <memory>
class Abs {
public:
virtual ~Abs() = 0;
};
Abs::~Abs(){ std::cout << "called\n"; }
class A: public Abs {};
class B: public Abs {};
Abs* Factory(int type)
{
switch(type)
{
case 1:
new A();
break;
case 2:
new B();
break;
}
}
int main()
{
std::unique_ptr<Abs> obj;
obj.reset(Factory(1));
return 0;
}