从curl到普通C ++函数的static_cast调用

时间:2014-07-15 08:28:56

标签: c++ curl

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

0 个答案:

没有答案