Boost message_queue: только конструктор позволяет мне настроить его, другие функции-члены недоступны - PullRequest
2 голосов
/ 27 сентября 2011

Это классический пример Boost message_queue:

#include <boost/interprocess/ipc/message_queue.hpp>
using namespace boost::interprocess;
struct Data { ... };

int main() {
    Data data1;

    message_queue::remove("message_queue");

    message_queue mq(create_only, "message_queue", 100, sizeof(Data));

    mq.send(&data1, sizeof(Data), 0);
}

Теперь я хотел бы поместить объект mq message_queue в класс в качестве переменной-члена с временем жизни объекта этого класса:

#include <boost/interprocess/ipc/message_queue.hpp>
using namespace boost::interprocess;

struct Data { ... };

class DataManager 
{
    message_queue mq;

public:
    DataManager() 
       : mq(create_only, "message_queue", 100, sizeof(Data))      // ok
    {
        mq.Open(create_only, "message_queue", 100, sizeof(Data));   // Open does not exist
    }
};

Кажется, я могу только инициализировать объект mq в списке инициализации члена, так как message_queue не предоставляет функции-члены для установки его параметров в более позднее время.

Я не прав? Есть ли другой способ сделать это?

Я хотел бы иметь возможность, например, позволить объекту использовать очередь сообщений, имя которой передается в качестве параметра одной из его функций-членов.

Спасибо.

1 Ответ

2 голосов
/ 27 сентября 2011

Как насчет этого:

class QueueManager
{
  boost::scoped_ptr<message_queue> mq;

  // ctor
  QueueManager(string msgqname) 
  {
      mq.reset(new message_queue(create_only, msgqname, 100, sizeof(Data));
  }
};

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

...