如何初始化作为类成员的智能指针?

时间:2016-11-12 14:37:19

标签: c++ smart-pointers

C ++相当新,所以这可能是一个非常愚蠢的问题。我需要成员函数cube_normalsread_models()访问proc_models()指针,每次调用read_models()时都必须初始化指针。

在我可以做的成员函数中:

PointCloud<A>::Ptr cube_normals (new PointCloud<A>);

我可以将指针传递给另一个函数但是我使用了12个这样的指针,它可能不是解决这个问题最干净的方法。

这是代码段。提前致谢!

class preproc
{

public:

    preproc();
    ~preproc();
    PointCloud<A>::Ptr cube_normals;

    void read_models();
    void proc_models();

private:

    ros::NodeHandle nh;
    ros::NodeHandle nh_priv;
};

1 个答案:

答案 0 :(得分:1)

问题

如果在成员函数中有这个陈述:

PointCloud<A>::Ptr cube_normals (new PointCloud<A>);

您将创建一个本地变量cube_normals,它将隐藏具有相同名称的类成员。

解决方案

如果目标是每次拨打read_models()时创建一个新的空对象,您可以选择分配。

问题在于以下内容不一定有效,具体取决于Ptr的定义方式:

cube_normals = new PointCloud<A>;  // but what do you do with the old pointer ?? 

假设你的smartpointer类是这样的:

template <class T>
class PointCloud {
public: 
    using Ptr = shared_ptr<T>;
}; 

然后你可以选择一个简单的:

cube_normals = PointCloud<A>::Ptr(new A); 

这个compiles nicely,尽管根据你正在使用的智能指针的类型使用make_shared或make_unique会更好。

我的建议是在PointCloud上工作,以确保正确的智能指针界面,包括将指针放在null上,然后创建指向新对象的指针。