Не в состоянии создать класс
Я новичок в 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 ответ
Вы пытаетесь вызвать конструктор для уже созданного объекта.
Эта строка терпит неудачу:
api(apiUrl);
Вызов, который вы пытаетесь выполнить, терпит неудачу, потому что компилятор ищет одну из этих функций:
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-интерфейсы инициализации с одним и двумя шагами в своих классах. Вам понадобится правильная функция сброса, чтобы избежать путаницы при повторной инициализации с новой строкой.