boost :: shared_ptr Ошибка подтверждения с boost :: asio: io_service

В настоящее время я пытаюсь понять, что такое boost :: asio-API. в одном из моих классов я использую boost :: shared_ptr для ссылки на io_service следующим образом:

class myClass : public boost::asio::serial_port
{
public:
myClass(std::string Port);

private:
boost::shared_ptr<boost::asio::io_Service> _io_service_ptr;
};

И реализация в соответствии с этим является:

myClass::myClass(std::string Port) : _io_service_ptr(new boost::asio::io_service),
boost::asio::serial_port(*_io_service_ptr, Port)
{
//do stuff
}

Когда я делаю это, я получаю ошибку: утверждение не удалось! px! = 0 […]

Когда используется тот же шаблон для других объектов boost :: asio (например, boost :: asio :: io_service :: work (service)), он работает нормально. Что я сделал не так с io_service?

0

Решение

Базовые классы инициализируются перед членами, поэтому io_service не создается до тех пор, пока вы не попытаетесь разыменовать неинициализированный указатель для передачи ссылки на базовый класс.

Но, исходя из serial_port кажется довольно странным; почему бы не использовать агрегацию вместо этого? Убедитесь, что сервис объявлен до того, как он будет использован:

class myClass {
public:
myClass(std::string port) : serial_port(io_service, port) {}

// public interface to interact with the serial port and whatever else

private:
boost::asio::io_service io_service; // or a shared pointer if there's a good reason
boost::asio::serial_port serial_port;
};

Также вероятно, что вы захотите поделиться одним сервисом со многими объектами, поэтому, возможно, он вообще не должен принадлежать этому классу:

class myClass {
public:
myClass(boost::asio::io_service & io_service, std::string port) :
serial_port(io_service, port)
{}

// public interface to interact with the serial port and whatever else

private:
boost::asio::serial_port serial_port;
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector