Я использую указатель абстрактного типа, который унаследован от базового класса.
В настоящее время каждый подкласс должен включать следующее поведение в своем конструкторе:
p = &f; //where p is the inherited pointer and f is the subclass filter
Естественно, я хочу перенести это поведение в базовый класс, но я изо всех сил пытаюсь получить эту работу. Я не уверен, связано ли это с тем, как я объявляю типы, или мне нужно изменить реализацию, чтобы отразить движение поведения (или что-то еще!).
По сути, я попытался скопировать эту строку и вызвать базовый конструктор через конструктор подкласса:
//base.h
class Base {
pcl::Filter<pcl::PointXYZRGB>* f;
public:
Base(pcl::Filter<pcl::PointXYZRGB> abs_filter);
};
//base.cpp
Base::Base(pcl::Filter<pcl::PointXYZRGB> abs_filter) { f = &abs_filter; }
//subclass.h
class Subclass: public Base {
pcl::VoxelGrid<pcl::PointXYZRGB> vg;
public:
Subclass(void);
};
//subclass.cpp
Subclass::Subclass(void): Base(vg) { }
Это не скомпилируется и выдает следующую ошибку:
error: cannot declare parameter ‘abs_filter’ to be of abstract type ‘pcl::Filter<pcl::PointXYZRGB>’
Я попытался взять адрес pcl::Filter<pcl::PointXYZRGB> &abs_filter
и изменить метод на f = abs_filter;
, но это также не компилируется, сообщая следующее:
error: cannot convert ‘pcl::Filter<pcl::PointXYZRGB>’ to ‘pcl::Filter<pcl::PointXYZRGB>*’ in assignment Base::Base(pcl::Filter<pcl::PointXYZRGB> &abs_filter) { f = abs_filter; }
Где я иду не так в том, что я делаю?
Любая помощь очень ценится!
2 ответа
При определении функции, имеющей параметр, переданный по значению, это то, что происходит
int myFun(myClass x) {
// x exists only in this function
// because is a copy of the argument passed to x
}
Так что меняй
Base(pcl::Filter<pcl::PointXYZRGB> abs_filter) { f = &abs_filter; }
Кому
Base(pcl::Filter<pcl::PointXYZRGB>& abs_filter) { f = &abs_filter; }
Не получить его копию, передать само значение.
Вы устанавливаете f для указателя на локальную переменную - это не будет работать (abs_filter является локальной копией переменной vg). Используйте одно из следующего:
Base::Base(pcl::Filter<pcl::PointXYZRGB>&abs_filter) { f = &abs_filter;}
Base::Base(pcl::Filter<pcl::PointXYZRGB>*abs_filter) { f = abs_filter; }
(с соответствующей сменой классов).
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который будет скомпилирован с помощью компилятора C ++). Используйте тег, зависящий от версии, для вопросов, связанных с конкретной редакцией стандарта [C ++ 11], [C ++ 14], [C ++ 17] или [C ++ 20] и т. Д.