Не в состоянии создать класс - PullRequest
0 голосов
/ 18 февраля 2019

Я новичок в C ++.Поэтому, пожалуйста, потерпите меня:

Я пытаюсь написать код для датчика температуры, который должен публиковать значения в API.

Я не могу создать экземпляр моего класса ApiClient.Я всегда получаю следующие ошибки:

  • IDE: вызов объекта типа класса без соответствующего оператора () или функции преобразования в указатель на тип функции
  • IDE: нет экземпляраперегруженной функции «ApiClient :: ApiClient» соответствует указанному типу
  • COMPILER: нет соответствия для вызова '(ApiClient) (String &)'

Мой код выглядит следующим образом (слегкауменьшено для облегчения чтения):

main.cpp

#include <ApiClient.h>
ApiClient api;

void setup()
{
  Serial.begin(115200);
  String apiUrl = "https://myapi.com/api";
  api(apiUrl); // ERROR: raises call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type

}

void loop()
{

  String temp = "49";
  api.sendValue("temperature", temp);
}

ApiClient.h

#ifndef WebClient_h
#define WebClient_h

#include <Arduino.h>
#include <WiFi.h>
#include <esp_wps.h>
#include <HTTPClient.h>

class ApiClient
{
public:
  ApiClient(); // this is only added for testing
  ApiClient(String apiUrl); // it should always instanciate with url
  void sendValue(String key, String value);
  String _apiUrl;
private:
};

#endif

ApiClient.cpp

#include <ApiClient.h>

String _apiUrl;

HTTPClient http;

ApiClient::ApiClient(String apiUrl) // IDE says: "no instance of overloaded function "ApiClient::ApiClient" matches the specified type"
{
  this->_apiUrl = apiUrl;
  // some stuff to establish a connection
}

1 Ответ

0 голосов
/ 18 февраля 2019

Вы пытаетесь вызвать конструктор для уже сконструированного объекта.

Эта строка завершается ошибкой:

api(apiUrl);

Вы пытаетесь вызвать вызов, потому что компилятор ищет один из этихfunctions:

return_type APIClient::operator()(const String&);
return_type APIClient::operator()(String); 
return_type APIClient::operator()(String&);

Ваше утверждение должно быть объявлением, если вы хотите, чтобы ваш конструктор вызывался.

ApiClient api(apiUrl);
// or better in c++11:
APIClient api{ apiUrl };

В качестве альтернативы, вы можете создать инициализатор в ApiClient, который принимает одну строкув качестве параметра, что-то вроде этого:

class ApiClient
{
public:
    ApiClient() { ...}
    ApiClient(const String& s) { Initialize(s); }
    Initialize(const String& s) { do the work }

    ...
};

Будьте внимательны при предоставлении API-интерфейсов инициализации в один или два шага в ваших классах.Вам потребуется правильная функция сброса, чтобы избежать путаницы при повторной инициализации новой строки.

...