如何在cpp类中声明zeromq套接字

Hel*_*ios -1 c++ class forward-declaration zeromq

我正在尝试使用 zmq 创建一个通用节点,该节点将形成动态计算图,但是我在类中的 zmq 套接字的前向声明中遇到错误。我想知道是否有人可以阐明这一点?该类的精简版本是:

\n\n

节点.hpp

\n\n
/* \n *  node.hpp\n*/ \n\n#ifndef NODE_\n#define NODE_\n\n#include <iostream>\n#include "zmq.hpp"\n\nclass Node\n{\nprivate:\n    std::string name_;\n    std::ostream& log_;\n    zmq::context_t context_;\n    zmq::socket_t subscriber_;\n    zmq::socket_t publisher_;\n\npublic:\n    Node(std::ostream& log, std::string name);\n    void sendlog(std::string msg);\n};\n\n#endif // NODE_ \n
Run Code Online (Sandbox Code Playgroud)\n\n

节点.cpp

\n\n
/* \n *  node.cpp\n*/ \n\n#include <iostream>\n#include <string>\n#include "zmq.hpp"\n#include "node.hpp"\n\nNode::Node(std::ostream& log, std::string name): \n    log_(log),\n    name_(name)\n{\n    sendlog(std::string("initialising ") + name_);\n\n    zmq::context_t context_(1);\n    zmq::socket_t subscriber_(context_, zmq::socket_type::sub);\n    zmq::socket_t publisher_(context_, zmq::socket_type::pub);\n\n    subscriber_.connect("ipc:///tmp/out.ipc");\n    publisher_.connect("ipc:///tmp/in.ipc");\n\n    sendlog(std::string("finished initialisation"));\n}\n\nvoid Node::sendlog(std::string msg)\n{\n    this->log_ << msg << std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我从 g++ 得到的错误

\n\n
g++ main.cpp node.cpp -lzmq\n\nnode.cpp: In constructor \xe2\x80\x98Node::Node(std::ostream&, std::__cxx11::string)\xe2\x80\x99:\nnode.cpp:12:15: error: no matching function for call to \xe2\x80\x98zmq::socket_t::socket_t()\xe2\x80\x99\n     name_(name)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是当我查看 zmq.hpp 时我看到

\n\n
namespace zmq\n{\nclass socket_t : public detail::socket_base\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

我认为我在某种程度上做的声明不正确?我不太精通 cpp,但我将其用作一个项目来重新开始,因此欢迎一般评论/文献参考。

\n

G.M*_*.M. 5

显示的代码有两个问题。首先与...

zmq::context_t context_(1);
zmq::socket_t subscriber_(context_, zmq::socket_type::sub);
zmq::socket_t publisher_(context_, zmq::socket_type::pub);
Run Code Online (Sandbox Code Playgroud)

您正在创建本地作用域的变量,这些变量会隐藏同名的成员变量。其次,因为您没有显式初始化subscriber_publisher_在构造函数的初始化程序列表中,编译器将尝试使用对其默认构造函数的隐式调用。但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"));
}
Run Code Online (Sandbox Code Playgroud)