Я использую http://ubuntuforums.org/showthread.php?t=781021 в качестве руководство о том, как написать программу на С++, которая использует libcurl для проверки веб-сайта и загрузки текста в приложение на С++. Когда я копирую код в свой проект визуальной студии, он работает с небольшими изменениями. Однако я столкнулся с проблемой, пытаясь преобразовать его в файлы на основе классов.
Я создал файлы .h
и .cpp
для выполнения запроса. Чего я раньше не осознавал, так это того, что handle_data
не является типичной функцией, поскольку ей не передаются никакие аргументы или даже ()
в середине Viewer.cpp. Вот как это сделал вышеупомянутый сайт, и это сработало, но я не понимаю, почему и как его преобразовать сейчас.
Кто-нибудь знает, что здесь происходит или как это исправить? Спасибо!
Зритель.h:
#pragma once
#include <string>
#include "curl.h"
class Viewer
{
public:
Viewer(void);
~Viewer(void);
std::string view(std::string q);
private:
size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream);
std::string contents;
};
Средство просмотра.cpp:
#include "stdafx.h"
#include "Viewer.h"
#include <iostream>
Viewer::Viewer(void)
{
std::cout << "ViewerCreated!\n";
}
Viewer::~Viewer(void)
{
}
size_t Viewer::handle_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
int numbytes = size*nmemb;
// The data is not null-terminated, so get the last character, and replace
// it with '\0'.
char lastchar = *((char *) ptr + numbytes - 1);
*((char *) ptr + numbytes - 1) = '\0';
contents.append((char *)ptr);
contents.append(1,lastchar);
*((char *) ptr + numbytes - 1) = lastchar; // Might not be necessary.
return size*nmemb;
}
std::string Viewer::view(std::string q)
{
char* url = "www.google.com";
CURL* curl = curl_easy_init();
if(curl)
{
// Tell libcurl the URL
curl_easy_setopt(curl,CURLOPT_URL, url);
// Tell libcurl what function to call when it has data
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle_data);
// Do it!
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (res == 0)
std::cout << contents << std::endl;
else
std::cerr << "Error: " << res << std::endl;
}
return contents;
}
handle_data
должен быть статичным. Один пример того, как это сделать можно найти здесь - person WhozCraig   schedule 28.02.2014