Просто: вы не можете использовать this
в инициализаторах. Идея состоит в том, чтобы предотвратить выход незавершенного объекта - Nested(this)
может сделать что-нибудь с вашим объектом, что приведет к очень запутанным и трудным для понимания ошибкам. Помните, что инициализаторы выполняют перед любым конструктором, который вы добавляете. То же самое не работает и для инициализаторов полей, точно так же:
private Nested _field = new Nested(this);
По сути, инициализаторы предназначены для выполнения простых инициализаций - исправления проблемы 98%. Все, что связано с this
, является более сложным, и вам нужно написать свой собственный конструктор - и взять на себя вину за любые проблемы синхронизации:)
У меня была такая же проблема. libcurl действительно завершена. Существует оболочка C ++ curlpp , которая может вас заинтересовать, когда вы просите библиотеку C ++. neon - еще одна интересная библиотека C, которая также поддерживает WebDAV .
curlpp кажется естественным, если вы используете C ++. В исходном коде есть много примеров. Чтобы получить содержимое URL-адреса, вы делаете что-то вроде этого (извлечено из примеров):
// Edit : rewritten for cURLpp 0.7.3
// Note : namespace changed, was cURLpp in 0.7.2 ...
#include <curlpp/cURLpp.hpp>
#include <curlpp/Options.hpp>
// RAII cleanup
curlpp::Cleanup myCleanup;
// Send request and get a result.
// Here I use a shortcut to get it in a string stream ...
std::ostringstream os;
os << curlpp::options::Url(std::string("http://www.wikipedia.org"));
string asAskedInQuestion = os.str();
См. Каталог examples
в исходном дистрибутиве curlpp , есть много более сложных случаев , а также простой полный минимальный с использованием curlpp.
мои 2 цента ...
C ++ не предоставляет никакого способа сделать это напрямую. Это будет полностью зависеть от того, какие платформы и библиотеки у вас есть.
В худшем случае вы можете использовать библиотеку boost :: asio для установления TCP-соединения, отправки HTTP-заголовков (RFC 2616) и непосредственного анализа ответов. Глядя на потребности вашего приложения, сделать это достаточно просто.
libCURL - очень хороший вариант для вас. В зависимости от того, что вам нужно сделать, учебное пособие должно сказать вам, что вы хотите, в частности, о простой ручке. Но, по сути, вы можете сделать это, просто чтобы увидеть источник страницы:
CURL* c;
c = curl_easy_init();
curl_easy_setopt( c, CURL_URL, "www.google.com" );
curl_easy_perform( c );
curl_easy_cleanup( c );
Я считаю, что это приведет к тому, что результат будет напечатан в stdout. Если вы хотите справиться с этим вместо этого - что, я полагаю, у вас есть - вам нужно установить CURL_WRITEFUNCTION. Все это описано в приведенном выше руководстве по curl.
Если вам нужно решение на C ++, вы можете использовать Qt . У него есть класс QHttp, который вы можете использовать.
Вы можете проверить docs :
http->setHost("qt.nokia.com");
http->get(QUrl::toPercentEncoding("/index.html"));
Qt также имеет гораздо больше возможностей, которые вы могли бы использовать в обычном приложении C ++.
C и C ++ не имеют стандартной библиотеки для HTTP или даже для соединений с сокетами. За прошедшие годы было разработано несколько переносимых библиотек. Как уже говорили другие, наиболее широко используется libcurl .
Вот список альтернатив libcurl (взятый с веб-сайта libcurl).
Также, для Linux это простой HTTP-клиент. Вы можете реализовать свой собственный простой HTTP-клиент GET, но это не сработает, если задействованы аутентификация или перенаправления, или если вам нужно работать через прокси. Для этих случаев вам понадобится полноценная библиотека, например libcurl.
Для исходного кода с libcurl, это наиболее близко к тому, что вам нужно (Libcurl имеет много примеров ). Посмотрите на основную функцию. Содержимое html будет скопировано в буфер после успешного подключения. Просто замените parseHtml своей собственной функцией.