2016-11-12 2 views
3

Довольно новый для 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; 
}; 
+0

Поскольку 'read_models()' и 'proc_models()' являются методами одного класса, для них не требуется особого доступа к 'cube_normals', члену того же класса. Они просто получают доступ к нему, как к локальной переменной. Ваш вопрос непонятен. Если у вас нет полного понимания основ C++, лучшим ответом будет продолжение чтения вашей книги на C++ и понимание представленного материала. –

+0

Являются ли ваши другие умные указатели всеми классами «PointCloud :: Ptr' или используются разные типы, а не' A'? –

ответ

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

Предполагая, что ваш класс умного указателя это что-то вроде:

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, чтобы обеспечить надлежащий интерфейс smartpointer, включая сохранение указателя на нуль, и руду создать указатель на новый объект.

Смежные вопросы