无法实例化 class
Not able to instanciate class
我是 C++ 的初学者。所以请耐心等待:
我尝试为温度传感器编写代码,它应该 post 值到 API。
我无法实例化我的 class ApiClient
。
我总是收到这些错误:
- IDE: 调用 class 类型的对象,没有适当的 operator() 或转换函数到函数指针类型
- IDE: 没有重载函数的实例 "ApiClient::ApiClient" 匹配指定的类型
- 编译器:与“(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
}
您正试图在已构造的对象上调用构造函数。
此行失败:
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 时要小心。在使用新字符串重新初始化时,您需要一个适当的重置函数来避免混淆。
我是 C++ 的初学者。所以请耐心等待:
我尝试为温度传感器编写代码,它应该 post 值到 API。
我无法实例化我的 class ApiClient
。
我总是收到这些错误:
- IDE: 调用 class 类型的对象,没有适当的 operator() 或转换函数到函数指针类型
- IDE: 没有重载函数的实例 "ApiClient::ApiClient" 匹配指定的类型
- 编译器:与“(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
}
您正试图在已构造的对象上调用构造函数。
此行失败:
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 时要小心。在使用新字符串重新初始化时,您需要一个适当的重置函数来避免混淆。