Невозможно получить доступ к члену из другой функции класса C ++ - PullRequest
1 голос
/ 14 марта 2019

Так что в основном мой код выглядит так:

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 (см. Скриншот).

Error screenshot

1 Ответ

3 голосов
/ 14 марта 2019

У вас, похоже, проблема с висящим указателем. Вы создаете объект клиента в стеке:

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 также должен быть членом вашего класса.

Вот более подробное объяснение движущихся указателей .

...