EDITED ::更确切地说,它是如何进行我不理解的static_cast函数调用。这条线
static_cast<curlGet*>(up)->setData(dataInside);
是运行时错误的起源。 结束编辑
我已尝试将curl与c ++一起使用,以及其他示例http://www.cplusplus.com/forum/unices/45878/
现在我想从c ++对象中调用它,然后将回复输出到其他对象。但是,我得到一个运行时错误,可能是在我调用我的写函数时,这是一个我无法解决的错误。 这应该是相关的FAQ http://curl.haxx.se/docs/faq.html#Using_C_non_static_functions_f
我的代码有两个文件,main.cpp和curlget.h。主要方法从做一个经典&#34;调用获取一个网页,然后创建一个getCurl对象并调用makeGet()方法,该方法应该再次执行相同的GET操作,但会产生运行时错误。
我似乎无法找到我的错误,并且理解如何从C ++对象中正确地执行C stuff然后将信息返回给另一个C ++对象。我已经查看了有关此问题的其他问题,但我对C / C ++交互感到不满。
配置curl.h的位置和curl库的编译器命令后,代码应该通过复制粘贴运行。我已跳过在单独的文件中执行类实现以避免混乱。
以下是代码:
的main.cpp
#include <iostream>
#include <string>
#include <include/curl/curl.h> //This must be changed according to local configuration
#include <curlget.h>
using namespace std;
string data;
size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{
for (int c = 0; c<size*nmemb; c++)
{
data.push_back(buf[c]);
}
return size*nmemb;
}
int main()
{
CURL* curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_perform(curl);
cout << endl << data << endl;
cin.get();
curl_easy_cleanup(curl);
curl_global_cleanup();
cout<<"MIDDLE ========================"<<endl;
curlGet c;
c.makeGet();
return 0;
}
curlget.h
#include <iostream>
#include <string>
#include <include/curl/curl.h>
#ifndef CURLGET_H
#define CURLGET_H
class curlGet
{
public:
curlGet(){};
std::string data2;
std::string setData(std::string s){
data2=s;
}
static size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{
std::string dataInside;
for (int c = 0; c<size*nmemb; c++)
{
dataInside.push_back(buf[c]);
}
static_cast<curlGet*>(up)->setData(dataInside);
//The line above "causes" the problem, no runtime error if the line is commented
return size*nmemb;
}
void makeGet(){
CURL* curl;
curl_global_init(CURL_GLOBAL_ALL); //pretty obvious
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/path");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlGet::writeCallback);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_perform(curl);
std::cout << std::endl << data2 << std::endl;
std::cin.get();
curl_easy_cleanup(curl);
curl_global_cleanup();
}
};
#endif // CURLGET_H