Я использую указатель абстрактного типа, который унаследован от базового класса.

В настоящее время каждый подкласс должен включать следующее поведение в своем конструкторе:

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; }

Где я иду не так в том, что я делаю?

Любая помощь очень ценится!

1
macourtney7 24 Апр 2017 в 14:33

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; }

Не получить его копию, передать само значение.

1
Garmekain 15 Май 2017 в 12:58

Вы устанавливаете 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; }

(с соответствующей сменой классов).

1
Hans Olsson 24 Апр 2017 в 11:53