Как объявить сокет zeromq в классе cpp - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь создать обобщенный c узел, используя zmq, который будет формировать динамический граф вычислений c, однако я получаю ошибку в прямом объявлении сокетов zmq в моем классе. Интересно, кто-нибудь может пролить свет на это? Сокращенная версия класса:

node.hpp

/* 
 *  node.hpp
*/ 

#ifndef NODE_
#define NODE_

#include <iostream>
#include "zmq.hpp"

class Node
{
private:
    std::string name_;
    std::ostream& log_;
    zmq::context_t context_;
    zmq::socket_t subscriber_;
    zmq::socket_t publisher_;

public:
    Node(std::ostream& log, std::string name);
    void sendlog(std::string msg);
};

#endif // NODE_ 

node. cpp

/* 
 *  node.cpp
*/ 

#include <iostream>
#include <string>
#include "zmq.hpp"
#include "node.hpp"

Node::Node(std::ostream& log, std::string name): 
    log_(log),
    name_(name)
{
    sendlog(std::string("initialising ") + name_);

    zmq::context_t context_(1);
    zmq::socket_t subscriber_(context_, zmq::socket_type::sub);
    zmq::socket_t publisher_(context_, zmq::socket_type::pub);

    subscriber_.connect("ipc:///tmp/out.ipc");
    publisher_.connect("ipc:///tmp/in.ipc");

    sendlog(std::string("finished initialisation"));
}

void Node::sendlog(std::string msg)
{
    this->log_ << msg << std::endl;
}

ошибка, которую я получаю от g ++

g++ main.cpp node.cpp -lzmq

node.cpp: In constructor ‘Node::Node(std::ostream&, std::__cxx11::string)’:
node.cpp:12:15: error: no matching function for call to ‘zmq::socket_t::socket_t()’
     name_(name)

однако, когда я смотрю в zmq.hpp, я вижу

namespace zmq
{
class socket_t : public detail::socket_base
...

Я предполагаю, что делаю объявление неправильно каким-то образом? Я не очень хорошо разбираюсь в cpp, но использую это как проект, чтобы вернуться к нулю, поэтому приветствуются общие комментарии / ссылки на литературу.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

С указанным кодом есть две проблемы. Во-первых, с помощью ...

zmq::context_t context_(1);
zmq::socket_t subscriber_(context_, zmq::socket_type::sub);
zmq::socket_t publisher_(context_, zmq::socket_type::pub);

вы создаете локальные переменные, которые скрывают переменные-члены с одинаковыми именами. Во-вторых, поскольку вы явно не инициализируете subscriber_ или publisher_ в списке инициализаторов ctor, компилятор попытается использовать неявный вызов их конструкторов по умолчанию. Но zmq::socket_t не имеет конструктора по умолчанию, поэтому вы видите ошибку.

Исправление состоит в том, чтобы просто переместить инициализацию context_, subscriber_ и publisher_ в инициализатор ctor список с ...

Node::Node(std::ostream& log, std::string name)
    : log_(log)
    , name_(name)
    , context_(1)
    , subscriber_(context_, zmq::socket_type::sub)
    , publisher_(context_, zmq::socket_type::pub)
{
    sendlog(std::string("initialising ") + name_);

    subscriber_.connect("ipc:///tmp/out.ipc");
    publisher_.connect("ipc:///tmp/in.ipc");

    sendlog(std::string("finished initialisation"));
}
0 голосов
/ 22 марта 2020

Следующие два (приватных) члена создаются с помощью конструктора по умолчанию (без аргументов):

zmq::socket_t subscriber_; zmq::socket_t publisher_;

Этот конструктор, однако, недоступен. Если вы хотите сохранить его как член, вам понадобится указатель и инициализируйте его с помощью new или инициализируйте его в списке инициализатора конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...