【问题标题】:Cannot access member from another function c++ class无法从另一个函数 c++ 类访问成员
【发布时间】:2019-03-14 15:02:16
【问题描述】:

所以基本上我的代码是这样的:

void SimpleMQTT::begin() {
    Serial.println("setserver");
    WiFiClient espClient;
    PubSubClient client(espClient);
    client.setServer(this->serverAddress, this->port);
    while(!client.connected()) {
        if (client.connect(this->deviceName)) {
            Serial.println("connected to mqtt");
            client.publish("connecting", "connected");
        } else {
            Serial.println("failed to connect");
        }
    }
    this->client = & client;
    //WORKING
    this->client->publish("connecting","conn2");
}

void SimpleMQTT::broadcast(char* channelName, char* message) {
    Serial.println("broadcasting");
    Serial.println(this->deviceName);
    //NOT WORKING
    this->client->connected();
    Serial.println("after broadcast");
}

从函数begin() 访问成员有效,但从函数broadcast() 访问同一成员无效。 Arduino 正在向 Serial 发送异常(见截图)。

【问题讨论】:

  • 你能详细说明什么不起作用吗?可能是错误消息?
  • 有没有可能broadcast(),this->client还没有初始化?
  • 在 arduino 板上运行程序时编译时没有错误消息,导致异常。我可以重新发布 arduino 在串行上显示的内容,但它对我没有任何帮助。
  • 我不知道,因为它的开始和延迟已经完成了
  • 为什么不能发布错误信息?只需输入或发布屏幕截图。

标签: c++ arduino mqtt


【解决方案1】:

您似乎遇到了悬空指针问题。 您在堆栈上创建客户端对象:

PubSubClient client(espClient);

然后参考它:

this->client = & client;

但是,一旦函数 SimpleMQTT::begin() 退出,client 将与函数堆栈的其余部分一起被删除。

您应该改为在堆上创建客户端对象。 将代码更改为:

void SimpleMQTT::begin() {
    Serial.println("setserver");
    WiFiClient* espClient = new WiFiClient();
    PubSubClient* client = new PubSubClient(espClient); // Allocate an object on the heap
    client.setServer(this->serverAddress, this->port);
    while(!client->connected()) {
        if (client->connect(this->deviceName)) {
            Serial.println("connected to mqtt");
            client->publish("connecting", "connected");
        } else {
            Serial.println("failed to connect");
        }
    }
    this->client = client;
    this->client->publish("connecting","conn2");
}

espClient 也应该是您班级的成员。

这里是对danling pointers的更详细的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多