【问题标题】:Variable initialised in Constructor is null, but initialised in class method works在构造函数中初始化的变量为空,但在类方法中初始化有效
【发布时间】:2022-02-04 22:08:06
【问题描述】:

我目前正在尝试在我的应用程序中执行以下操作:

#include "zmqworker.h"
#include <QDebug>

ZMQWorker::ZMQWorker(QObject *parent)
    : QObject{parent}
{
    zmq::context_t ctx;
    zmq::socket_t sock(ctx, zmq::socket_type::dealer);

    qDebug() << "Dealer Socket created";

}

void ZMQWorker::connectSocket()
{
//    zmq::context_t ctx;
//    std::string origin="CPP_ZMQ";

    sock.connect("tcp://127.0.0.1:5555");
    qDebug() << sock;
    qDebug() << "Dealer Socket connected";

}

我正在尝试在构造函数中创建一个套接字,它肯定会被调用。在连接函数中,我试图连接到 zmq 套接字。由于 sock 为 0x0,因此引发异常。如果我在 connectSocket 函数中执行所有部分,则它可以正常工作并且 sock 不为​​空。

因为我只习惯于 Java、Python、JavaScript 和 Go 这样的语言,所以这种行为对我来说没有意义,虽然我可以尝试直到找到解决方案,但我不想遇到我只是得到一些有用的东西,但我不明白。

应用是QT6.2
C++20/CMake

【问题讨论】:

  • sock 在超出范围时被销毁,使其成为数据成员。
  • 您没有显示完整的代码。请提供minimal reproducible example。但无论如何:zmq::socket_t sock(ctx, zmq::socket_type::dealer); 不会初始化名为sock 的类成员。它创建了一个名为sock 的新函数局部变量,该变量一直存在到函数结束。您正在成员初始化器列表中正确初始化类成员(而不是基类):QObject{parent}。对sock 执行相同操作。
  • 当然可以……#facepalm

标签: c++ qt zeromq


【解决方案1】:

作为参考,这是 user17732522 所指的

#include "zmqworker.h"
#include <QDebug>

ZMQWorker::ZMQWorker(QObject *parent)
    : QObject{parent},

     sock(ctx, zmq::socket_type::dealer)
{



    qDebug() << "Dealer Socket created";


}

void ZMQWorker::connectSocket()
{
    std::string origin="CPP_ZMQ";
    sock.connect("tcp://127.0.0.1:5555");
    qDebug() << "Dealer Socket connected";

}

【讨论】:

  • 请接受正确答案
  • 您没有显示 zmqworker.h 的内容,这意味着我们不知道类成员的初始化顺序。例如,如果您要将ctx(0) 添加到您的初始化列表中,您将获得不同的结果,具体取决于ZMQWorker.sockZMQWorker.ctx 的相对定义顺序。这就是为什么我们要求一个最小的可行示例。
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 2015-02-19
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多