-1

我是 C++ 的初学者。所以请多多包涵:

我尝试为应该将值发布到 API 的温度传感器编写代码。

我无法实例化我的课程ApiClient。我总是收到这些错误:

  • IDE:在没有适当的 operator() 或将函数转换为指针函数类型的情况下调用类类型的对象
  • IDE:没有重载函数“ApiClient::ApiClient”的实例与指定的类型匹配
  • 编译器:不匹配调用 '(ApiClient) (String&)'

我的代码看起来像这样(为了便于阅读,稍微精简了一些):

主文件

#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
}
4

1 回答 1

0

您正试图在已构造的对象上调用构造函数。

此行失败:

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 时要小心。在使用新字符串重新初始化时,您需要一个适当的重置功能以避免混淆。

于 2019-02-18T20:51:51.343 回答