Проблема 1
Если вы не инициализируете переменные-члены (и базовые классы) с помощью списка инициализаторов в конструкторе, они инициализируются по умолчанию. Т.е.
ROSserial::ROSserial(void)
{
this->lps22hb_air_temperature_t_ = new sensor_msgs::Temperature();
}
эквивалентно
ROSserial::ROSserial(void) : nh(),
lps22hb_air_temperature_t_(),
lps22hb_air_temperature_publisher_t()
{
this->lps22hb_air_temperature_t_ = new sensor_msgs::Temperature();
}
Сообщение об ошибке от компилятора указывает, что lps22hb_air_temperature_publisher_t
не может быть инициализирован по умолчанию. Следовательно, он должен быть соответствующим образом инициализирован.
Проблема 2
this->lps22hb_air_temperature_publisher_t("LPS22HB_Temperature", this->lps22hb_air_temperature_t_);
Этот синтаксис действителен в списке инициализации конструктора для инициализации члена, но это неправильный синтаксис для установки стоимость объекта. Вы можете использовать
this->lps22hb_air_temperature_publisher_t = ros::Publisher("LPS22HB_Temperature", this->lps22hb_air_temperature_t_));
, чтобы установить значение lps22hb_air_temperature_publisher_t
.
Разрешение
Вы можете решить обе проблемы следующим образом:
- Удаление функции-члена
Init
и - Использование вместо этого делегирующего конструктора.
class ROSserial
{
private:
// Node handler
ros::NodeHandle nh;
// Temperature data
sensor_msgs::Temperature *lps22hb_air_temperature_t_;
// Constructor, for private usage.
ROSserial(std::string const& desc,
sensor_msgs::Temperature* temp);
public:
// Temperature publisher/topic
ros::Publisher lps22hb_air_temperature_publisher_t;
// Class constructor
ROSserial();
};
ROSserial::ROSserial(std::string const& desc,
sensor_msgs::Temperature* temp) :
lps22hb_air_temperature_t_(temp),
lps22hb_air_temperature_publisher_t(desc, temp)
{
// Initialize ROS node
this->nh.initNode();
this->nh.advertise(lps22hb_air_temperature_publisher_t);
}
// Use delegating constructor.
ROSserial::ROSserial() : ROSserial("LPS22HB_Temperature", new sensor_msgs::Temperature())
{
}