2012-02-06 5 views
6

У меня есть класс, который имеет объект boost::asio::io_service. Я хочу, чтобы этот объект хранился в boost::shared_ptr.Инициализировать Boost shared_ptr в конструкторе

Так что мой заголовок выглядит следующим образом (я избавилась от любого ненужного кода, так что не отвлекает)

class CommandDispatcher 
{ 
private: 
    boost::shared_ptr<boost::asio::io_service> m_ioservice; 
public: 
    CommandDispatcher(); 
}; 

Когда я теперь создать объект CommandDispatcher Я хочу, что io_service объект инициализируется для указатель. Теперь я не совсем уверен, как это сделать. Я посмотрел два разных вопроса, но работает только один, и я не совсем уверен, хорош ли он. Но смотрите сами:

CommandDispatcher::CommandDispatcher() 
{ 
    m_ioservice.reset(new boost::asio::io_service);   // this actually works 
    //m_ioservice = boost::make_shared<boost::asio::io_service> 
    // (new boost::asio::io_service);      // this doesn't work 
} 

Так reset вызов работает, но я думаю, что это на самом деле один переназначить указатель. Так что не ошибается, чтобы использовать его, но это не похоже на лучшее решение для меня. Предложение для звонка make_shared Я нашел в другом вопросе. Но это просто не сработает для меня (я реализовал его, как описано в официальном примере повышения). Я получаю

/usr/local/include/boost/smart_ptr/make_shared.hpp:189: error: invalid conversion from ‘boost::asio::io_service*’ to ‘size_t’

/usr/local/include/boost/smart_ptr/make_shared.hpp:189: error: initializing argument 1 of ‘boost::asio::io_service::io_service(size_t)’

Я не совсем уверен, как сделать это сейчас, что было бы лучшим способом (может быть, есть полный другой вариант, чтобы сделать это). Или, может быть, я делаю это правильно, но я получаю что-то с ошибкой io_service.

Надеюсь, что этот вопрос еще не был здесь (я поднял какой-то старый вопрос, но никакой ответ мне не подходит).

+0

Почему частные переменные перечислены перед публичными методами? Разумеется, публичный интерфейс более важен, чем частные детали реализации? :)

+0

Ну, я действительно подумал (и узнал некоторое время назад), что это «хороший тон», чтобы сначала объявить переменные public и private member, а затем объявить публичные и частные методы. – Toby

+0

Я думаю, что большинство людей больше интересуется публичным интерфейсом, в отличие от того, какие переменные вы используете для его достижения. –

ответ

7
CommandDispatcher::CommandDispatcher() 
    : m_ioservice(new boost::asio::io_service) // ver 1. this is how you should do it. 
{ 
    //m_ioservice.reset(new boost::asio::io_service); // ver 2  
    //m_ioservice = boost::make_shared<boost::asio::io_service>(); // ver 3 
} 
+0

Да, это работает (и кажется приятным), но я не понимаю, где разница между этим вызовом и 'm_ioservice = new boost :: asio :: io_service', который на самом деле не работает ??? – Toby

+0

Какой звонок «этот звонок»? – ronag

+0

Ха-ха, извините за формулировку этого немного расплывчатым. Если u сказать 'CommandDispatcher :: CommandDispatcher(): m_ioservice (new boost :: asio :: io_service)' не то же самое, что сказать 'CommandDispatcher :: CommandDispatcher() {m_ioservice = new boost :: asio :: io_service; } '? – Toby

8

Если вы используете make_shared, то вы не используете new; вы передаете ему аргументы конструктора, и он создаст для вас объект. В этом случае не аргументы, так что просто сделать:

m_ioservice = boost::make_shared<boost::asio::io_service>(); 

хотя было бы лучше, чтобы инициализировать его в списке Инициализатора, а не тело конструктора:

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(boost::make_shared<boost::asio::io_service>()) 
{ 
} 

Использование make_shared имеет преимущество что он будет выполнять только одно выделение памяти, а для инициализации с использованием new boost::asio::io_service потребуются два (один для объекта и один для общего количества ссылок).

1

хорошего путь, вероятно,

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(new boost::asio::io_service) 
{ 
} 

, потому что альтернатива есть у вас по умолчанию, построение shared_ptr первыми, а затем переназначить его.

Или, что то же самое, используя make_shared:

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(boost::make_shared<boost::asio::io_service>()) 
{ 
} 
0

Есть несколько способов:

  • для простой инициализации, создать в списке конструктора:

.

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(new boost::asio::io_service) 
{ 
} 
  • для инъекций зависимостей с использованием завода:

.

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(Factory::Create()) 
{ 
} 
  • для инъекций зависимостей, используя пропусканием уже созданный объект:

.

CommandDispatcher::CommandDispatcher(boost::shared_ptr<boost::asio::io_service> service) : 
    m_ioservice(service) 
{ 
} 
Смежные вопросы