如何在 cpp 中声明 zeromq 套接字 class
How to declare a zeromq socket in a cpp class
我正在尝试使用 zmq 创建一个通用节点,它将形成一个动态计算图,但是我在 class 中的 zmq 套接字的前向声明中遇到错误。我想知道是否有人可以对此有所了解? class 的精简版本是;
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,但我将其用作一个项目以重新开始,因此欢迎一般 comments/literature 参考。
以下两个(私有)成员是通过默认(零参数)构造函数创建的:
zmq::socket_t subscriber_;
zmq::socket_t publisher_;
但是,该构造函数不可用。如果你想把它存储为一个成员,你需要一个指针并通过 new
初始化它或者在构造函数的初始化列表中初始化它。
显示的代码有两个问题。首先是...
zmq::context_t context_(1);
zmq::socket_t subscriber_(context_, zmq::socket_type::sub);
zmq::socket_t publisher_(context_, zmq::socket_type::pub);
您正在创建局部范围的变量,这些变量会隐藏同名成员变量。其次,因为您没有在 ctor 的初始化列表中显式初始化 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"));
}
我正在尝试使用 zmq 创建一个通用节点,它将形成一个动态计算图,但是我在 class 中的 zmq 套接字的前向声明中遇到错误。我想知道是否有人可以对此有所了解? class 的精简版本是;
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,但我将其用作一个项目以重新开始,因此欢迎一般 comments/literature 参考。
以下两个(私有)成员是通过默认(零参数)构造函数创建的:
zmq::socket_t subscriber_;
zmq::socket_t publisher_;
但是,该构造函数不可用。如果你想把它存储为一个成员,你需要一个指针并通过 new
初始化它或者在构造函数的初始化列表中初始化它。
显示的代码有两个问题。首先是...
zmq::context_t context_(1);
zmq::socket_t subscriber_(context_, zmq::socket_type::sub);
zmq::socket_t publisher_(context_, zmq::socket_type::pub);
您正在创建局部范围的变量,这些变量会隐藏同名成员变量。其次,因为您没有在 ctor 的初始化列表中显式初始化 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"));
}