private funktion kann private variable nicht lesen
-
Hallo,
ich hab ein problem und kann mir den fehler nicht erklären ich poste erstmal den code:
StundenplanDB.h#ifndef STUNDENPLANDB_H #define STUNDENPLANDB_H #include <iostream> #include <string> class StundenplanDB { public: class Exception { public: Exception(const std::string& errortext) { m_Errortext = errortext; } virtual const char* what() const { return m_Errortext.c_str(); } virtual ~Exception() {} private: std::string m_Errortext; }; StundenplanDB() throw(Exception) {} virtual void connect() = 0; virtual void close() = 0; virtual std::string query(std::string query) = 0; }; #endifSQL.h
#ifndef SQL_H #define SQL_H #include "StundenplanDB.h" #include <string> #include <vector> #include <sqlite3.h> class SQL : public StundenplanDB { public: virtual void connect(); virtual void close(); virtual std::string query(std::string query); private: sqlite3 *m_db; //char *errMsg; int m_rc; std::vector<std::string> m_return; static int callback(void *NotUsed, int argc, char **argv, char **azColName); }; #endifSQL.cpp
#include "SQL.h" using namespace std; void SQL::connect() { m_rc = sqlite3_open("stundenplan.db", &m_db); if(m_rc) { string error = "Konnte Datenbank nicht öffnen:"; error += sqlite3_errmsg(m_db); throw Exception(error.c_str()); } } void SQL::close() { sqlite3_close(m_db); } string SQL::query(string query) { //throw Exception("Fehlerhafte Anfrage"); } static int callback(void* NotUsed, int argc, char **argv, char **azColName) { int i; for(i=0; i<argc; i++) { //------------->//HIER SQL.cpp:27: error: ... <----------------------------- m_return.push_back("Hallo");//(argv[i] ? argv[i] : "NULL"); } return 0; }Fehler:
SQL.cpp:27: error: `m_return' undeclared (first use this function)
SQL.cpp:27: error: (Each undeclared identifier is reported only once for each
function it appears in.)
hab die stelle markiert
habt ihr villeicht eine idee?
-
Abgesehen davon dass deine Definition von callback nicht der Klasse zugehört sondern als Funktion für sich steht (da würde SQL:: fehlen), kannst Du in einer statischen Methode niemals auf ein Mitglied zugreifen. Warum? Weil Du für den Aufruf einer statischen Methode kein Objekt brauchst, zu dem dieses Mitglied gehören könnte. Genauergesagt gibt es in static SQL::callback keine gültige Instanz der Klasse SQL.
EDIT: Hint! GENAU für sowas sind im allgemeinen solche void-Zeiger wie Dein NotUsed gedacht

-
du meinst die statische memberfunktion
int SQL::callback( // ...nicht die freie funktion
static int callback( // ...
-
hallo,
wie funktioniert das mit void*
(die callback funktion ist nicht von mir hab sie aus der doku von sqlite3)
vielen dank
-
Die callback-Methode musst Du ja irgendwo bei sqlite registrieren. Dort kannst Du mit ziemlicher Sicherheit auch ein void* übergeben, was dann immer der Callback-Funktion übergeben wird, wenn diese von sqlite aufgerufen wird. Sinngemäß etwa:
... SQL *sqlobject = new SQL(); sqlite_register_callback(SQL::callback, (void*)sqlobject); // Achtung Pseudocode ... int SQL::callback(void* NotUsed, int argc, char **argv, char **azColName) { SQL *sqlobject = (SQL*)NotUsed; /* arbeite mit sqlobject->m_Return */ }P.S.: Soweit ich weiss gibts für sqlite aber auch einen C++-Wrapper (?)
-
du kannst auch m_return static machen:
static std::vector<std::string> m_return;