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

4

我对C++还比较陌生,所以这可能是一个非常愚蠢的问题。我需要让cube_normals指针可以被两个成员函数read_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;
};

由于read_models()proc_models()是同一类中的方法,因此它们可以直接访问cube_normals,这是该类的成员变量。它们可以像访问本地变量一样进行访问。您的问题不太清楚。如果您对C++基础知识没有完全理解,最好的答案是继续阅读C++书籍,并理解所呈现的材料。 - Sam Varshavchik
你的其他智能指针都是 PointCloud<A>::Ptr 类型的吗?还是有不同于 A 的类型被使用了? - πάντα ῥεῖ
如果您想要重置 cube_normals 以指向一个新对象,那么可以使用 cube_normals.reset(new PointCloud<A>) - Igor Tandetnik
@SamVarshavchik,如果问题不清楚,我很抱歉。每次调用read_models()时,我需要重新初始化指针。无论如何,我会再次回到书本上的。谢谢! - chou
@IgorTandetnik,我觉得 reset 可以解决我的问题。应该早点想到。谢谢! - chou
@πάνταῥεῖ 指针具有不同的类型。 - chou
1个回答

2

问题

如果在成员函数内部有以下语句:

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 ?? 

假设您的智能指针类类似于以下内容:
template <class T>
class PointCloud {
public: 
    using Ptr = shared_ptr<T>;
}; 

您可以选择简单的方式:
cube_normals = PointCloud<A>::Ptr(new A); 

这段代码编译良好,但最好根据所使用的智能指针类型使用make_shared或make_unique。

我的建议是在PointCloud上工作,确保正确的智能指针接口,包括将指针重置为null,或创建一个指向新对象的指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接