2010-11-19 7 views
8
class Filter{ 
private: 
    string contents; 
    bool Server(void); 
public: 
    void handle(void *, size_t, size_t, void *); 
    }; 

Ho un'intestazione di classe come questa. Voglio chiamare arricciare WRITEFUNCTION all'interno della funzione Server che userebbe l'handle per scrivere sul contenuto della stringa. anche se mi tiene giveng l'errorearricciatura WRITEFUNCTION e classi

error: invalid use of member (did you forget the ‘&’ ?) 

la linea indicata da errore è quello di CURLOPT_WRITEFUNCTION .... Il mio ricciolo richiesta sembra qualcosa di simile ...

curl_easy_setopt(curl,CURLOPT_URL, address.c_str()); 
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle); 
curl_easy_perform(curl); 

che significa che il suo grado di accedere al manico() .. come posso rettificare questo?

risposta

2
string temp; 

curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle); 
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&temp); 

size_t Filter::handle(void *ptr, size_t size, size_t nmemb, string stream) 
{ 
    string temp(static_cast<const char*>(ptr), size * nmemb); 
    stream = temp; 
    return size*nmemb; 
} 

thats come ho ottenuto di lavorare .. questo farà risparmiare il sito web per la stringa denominata Temp.

+1

Questo crea una stringa std :: string temp locale in cui i dati sono archiviati, quindi viene copiata nel flusso di argomenti Quando la funzione ritorna, entrambe le stringhe verranno eliminate. Utilizzare temp.append (...) invece di scrivere i dati nella stringa globale temp O utilizzare la firma corretta con un puntatore alla stringa globale e chiamare append attraverso questo puntatore. – hansmaad

+0

Dovresti usare append perché la funzione di scrittura può essere chiamata più volte per una risorsa che stai caricando – hansmaad

+0

che si blocca su di me – Tim

16

la maniglia deve essere una funzione membro statico. È possibile passare un puntatore all'istanza di filtro come ultimo argomento utilizzando CURLOPT_WRITEDATA

class Filter 
{ 
private: 
    std::string content_; 
    static size_t handle(char * data, size_t size, size_t nmemb, void * p); 
    size_t handle_impl(char * data, size_t size, size_t nmemb); 
}; 

size_t Filter::handle(char * data, size_t size, size_t nmemb, void * p) 
{ 
    return static_cast<Filter*>(p)->handle_impl(data, size, nmemb); 
} 

size_t Filter::handle_impl(char* data, size_t size, size_t nmemb) 
{ 
    content_.append(data, size * nmemb); 
    return size * nmemb; 
} 

int main() 
{ 
    // curl initialization... should be done in a constructor 
    Filter f; 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &f); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Filter::handle); 
    // curl cleanup... should be done in a destructor 
    return 0; 
} 
+0

c'è qualche altro modo di creare un'istanza? –

+1

Se si desidera scrivere su std :: string Filter :: contents, è necessaria un'istanza. Se si desidera scrivere su un buffer di contenuto globale, è sufficiente utilizzare il metodo di gestione statica o una funzione di gestione libera. – hansmaad

+1

+1, questa è la strada da percorrere. @Prasanth Madhavan, a cui 'Filter' sarebbe' handle' scrivere se non hai creato un'istanza? –

1

Sto usando curlpp:

std::stringstream result; 

request.setOpt(cURLpp::Options::WriteStream(&result)); 
request.perform(); 

questo salverà il server web risposta alla stringstream chiamato risultato.

Problemi correlati