variable aus **argv initialisieren in einem static int



  • Moin ich kann der int Variable "versuch" nicht ihren passenden Wert geben 😞
    Zeile 61 error from this location.

    Ich häng da schon seit drei Tagen dran 😕
    Fehler:

    databaselite.h|15|error: invalid use of member ‘databaselite::versuch’ in static member function|

    und

    /home/cseipel/Code::Blocks Kram/GTK/test project/animedata/databaselite.h|61|error: from this location|

    Habt Gnade ich bin ein totaler Anfänger ;__;

    databaselite.h

    #ifndef DATABASELITE_H_INCLUDED
    #define DATABASELITE_H_INCLUDED
    
    #include <iostream>
    #include <vector>
    #include <sqlite3.h>
    #include <string>
    #include <stdlib.h>
    #include <stdio.h>
    using namespace std;
    
    class databaselite{
    private:
    
        int versuch;
    
        static int ca;
    
        int **argc;
        char  ***argv;
    
        sqlite3 *db;
        char *zErrMsg = 0;
        int rc;
        char *sql;
        const char* data = "Callback function called";
    
    public:
    
    /* KONSTRUKTOR */
        databaselite(int *e, char **a){argc = &e; argv = &a;};
    /*---------------------------------*/
    
    /* SPIELEREIN */
    
        void get_argc(){
            cout << endl << **argc;
        }       // juhu[0][0] wäre auch möglich
    
        void get_argv(){ cout << argv[0][0] << endl << "argv";};
    /* ---------------------------------- */
    
        static int callback(void *data, int argc, char **argv, char **azColName){
            int i;
            for(i=0; i<argc; i++){
                cout << azColName[i] << " = " << argv[i] << endl;
    
            }
            cout << endl;
            return 0;
        }
    
            static int COUNTcallback(void *data, int argc, char **argv, char **azColName){
    
            for(int i=0; i<argc; i++){ }
            cout << endl << "-->" << **argv << endl;
            // EINE ZEILE WEITER UNTEN IST DAS PROBLEM
    
            versuch = atoi (*argv);
    
            return 0;
        }
    
        void ok(){
            rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
            if( rc != SQLITE_OK ){
                cout << "SQL Fehler: " << zErrMsg;
                sqlite3_free(zErrMsg);
            }else{
          cout << "Operation wurde erfolgreich ausgeführt\n";
       }
    
       }// OK ENDE
    
        void open(){
                rc = sqlite3_open("test.db", &db);
    
                    if( rc ){
                        cout << "Datenbank öffnen fehlgeschlagen: " << sqlite3_errmsg(db);
    
                    }else{
                        cerr << "Datenbank wurde erfolgreich geöffnet\n";
    
                    }
            // sqlite3_close(db);
        } // ende von open
    
        void close_database(){
             sqlite3_close(db);
             cout << endl << "Datenbank wurde geschlossen";
        }
    
        void select(){
            sql = "SELECT * FROM Serien";
            ok();
        }
    
        void insert(){
        sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
              "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
             "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
             "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
             "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
    
       /* Execute SQL statement */
       rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
       if( rc != SQLITE_OK ){
    	cout << "SQL Fehler: "  << zErrMsg;
          sqlite3_free(zErrMsg);
       }else{
          cout << "Records created successfully" << endl;
       }
    
        } // INSERT ENDING
    
        void update(){
            sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; ";
            ok();
       } // UPDATE ENDE
    
       void loeschen(){
            sql = "DELETE from COMPANY where ID=2;";
            ok();
       } // DELETE ENDE
    
       void count(){
        sql = "SELECT count(*) FROM Serien";
       /* Execute SQL statement */
        rc = sqlite3_exec(db, sql, COUNTcallback, (void*)data, &zErrMsg);
    
    /*
        if( rc != SQLITE_OK ){
           cerr << "SQL error: "<<  zErrMsg << "\n";
          sqlite3_free(zErrMsg);
       }else{
          fprintf(stdout, "Operation done successfully\n");
       } */
    
        }// COUNT
    
    };
    
    #endif // DATABASELITE_H_INCLUDED
    

    und hier der rest falls ihr ihn braucht.

    startmenue.h

    #ifndef STARTMENUE_H_INCLUDED
    #define STARTMENUE_H_INCLUDED
    
    #include <iostream>
    #include <string>
    
    #include "databaselite.h"
    
    /* Für die Eingabe von nur einen Zeichen [X1] */
    #include <stdio.h>
    #include <string.h>
    
    using namespace std;
    
    #include "menue.h"
    
    class startmenue : public menue{
    private:
            databaselite *dl;
    public:
    
        startmenue(databaselite *A){dl = A;};
        ~startmenue(){};
    
    void menue_anzeigen(){
        cout << "1. Liste ansehen" << endl << "2. Anime Eintragen" << endl << "3. Lizens ";
    };
    
    void menue_eingabe(){
    
        cout << endl;
    
        string eingabe;
        eingabe = "XX";
    
        bool dewahrheit = false;
    
        while(dewahrheit == false){
        cin >> eingabe;
    
            if(eingabe.size() == 1){
                if(eingabe == "1"|| eingabe == "2"|| eingabe == "3" ){
    
                    /* DATENBANK AKTIONEN */
                    cout << endl << "....................DATENBANK.............................\n" << endl;
                    if(eingabe == "1"){
                        dl->select();
                    }else if(eingabe == "2"){
                        cout << endl <<  "EINFÜGEN" << endl;
                        dl->count();
    
                        //  dl->insert();
                    }
    
                    dewahrheit = true;
                }else{
                    cout << "Du sollst eine Zahl zwischen 1 und 3 eingeben.";
                    eingabe.clear();
                }
    
            }else{
                eingabe.clear();
                cout << "Du hast zu viele Zeichen eingegeben";
            }
        }
    } // ENDE menue_eingabe()
    
    };
    
    #endif // STARTMENUE_H_INCLUDED
    

    main.cpp

    #include <iostream>
    #include <string>
    #include "../Kommandozeilenparameter/kommandozeilenparameter help.h"
    
    #include <sqlite3.h>
    
    #include "startmenue.h"
    #include "listmenue.h"
    
    #include "databaselite.h"
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        cout << endl << endl;
        Kommandozeilenparameter_help help;
        help.kontrolle(argc,argv);
    
        databaselite serie(&argc,argv);
        serie.open();
        startmenue sm(&serie);
    
        sm.menue_anzeigen();
        sm.menue_eingabe();
    
        serie.close_database();
        //serie.get_argv();
        //serie.get_argc();
    
    }
    

  • Mod

    Der unmittelbare Fehler geht doch direkt aus der Fehlermeldung hervor: Die Memberfunktion COUNTcallback ist bei dir static (d.h. sie bezieht sich auf keine konkrete Instanz von databaselite , sondern ist quasi eine freie Funktion, die mit der Klasse assoziiert wird), aber dennoch greifst du auf den nicht-statischen Member versuch zu (also einer Variablen, die zu einer bestimmten Instanz von databaselite gehört). Wie soll das gehen? Die Funktion kann nicht einerseits ohne konkrete Instanz aufrufbar sein, aber gleichzeitig eine konkrete Instanz benötigen.

    Insgesamt: Ich glaube, du übernimmst dich gewaltig mit der Aufgabe, üb dich erstmal an etwas Einfacherem. Vor allem vernünftigem C++. Du scheinst leider in den Genuss eines "C++ ist C mit Klassen"-Lehrers gekommen zu sein, der viel von Zeigern erzählt hat. Weder scheinst du diese Zeiger richtig verstanden zu haben, noch würde der Code in dogmatischeren C++ auch nur entfernt so aussehen. Da hättest du so gut wie keine Zeiger, zumindest keine die so direkt sichtbar sind. Und falls doch direkt sichtbar, dann mit ganz klarer Ansage, wie die Besitzverhältnisse sind.



  • SeppJ schrieb:

    Weder scheinst du diese Zeiger richtig verstanden zu haben, noch würde der Code in dogmatischeren C++ auch nur entfernt so aussehen. Da hättest du so gut wie keine Zeiger, zumindest keine die so direkt sichtbar sind. Und falls doch direkt sichtbar, dann mit ganz klarer Ansage, wie die Besitzverhältnisse sind.

    Das ist schwer, wenn die sqlite-API in "C/C++" d.h. in C gehalten ist und die Schnittstelle so aussieht:

    int sqlite3_open(
          const char *filename,   /* Database filename (UTF-8) */
          sqlite3 **ppDb          /* OUT: SQLite db handle */
        );
        int sqlite3_open16(
          const void *filename,   /* Database filename (UTF-16) */
          sqlite3 **ppDb          /* OUT: SQLite db handle */
        );
        int sqlite3_open_v2(
          const char *filename,   /* Database filename (UTF-8) */
          sqlite3 **ppDb,         /* OUT: SQLite db handle */
          int flags,              /* Flags */
          const char *zVfs        /* Name of VFS module to use */
        );
    

    Klar, wer sich mit C++ auskennt, kann damit gut umgehen, aber als Anfänger ist es nur zu sehr verlockend, sich diesen Stil anzugewöhnen.

    Deshalb rate ich von Datenbankanwendungen erstmal ab, und wenn es unbedingt sein muss, dann empfehle ich SOCI.



  • Es gibt aber auch C++-Wrapper für SQLite, z.B.
    CppSQLite - C++ Wrapper for SQLite
    Kompex SQLite Wrapper for C++



  • Th69 schrieb:

    Es gibt aber auch C++-Wrapper für SQLite, z.B.
    CppSQLite - C++ Wrapper for SQLite
    Kompex SQLite Wrapper for C++

    Äh ja, sie existieren.

    Die erste empfiehlt solchen Code:

    char buf[128];
                sprintf(buf, 
           "insert into emp (empname) values ('Empname%06d');", i+1);
                db.execDML(buf);
                cout << " primary key: " << db.lastRowId() << endl;
    

    Bei der zweiten sieht das so aus:

    Kompex::SQLiteDatabase *pDatabase = new Kompex::SQLiteDatabase("test.db", SQLITE_OPEN_READWRITE, 0);
    


  • SeppJ schrieb:

    Der unmittelbare Fehler geht doch direkt aus der Fehlermeldung hervor: Die Memberfunktion COUNTcallback ist bei dir static (d.h. sie bezieht sich auf keine konkrete Instanz von databaselite , sondern ist quasi eine freie Funktion, die mit der Klasse assoziiert wird), aber dennoch greifst du auf den nicht-statischen Member versuch zu (also einer Variablen, die zu einer bestimmten Instanz von databaselite gehört). Wie soll das gehen? Die Funktion kann nicht einerseits ohne konkrete Instanz aufrufbar sein, aber gleichzeitig eine konkrete Instanz benötigen.

    Insgesamt: Ich glaube, du übernimmst dich gewaltig mit der Aufgabe, üb dich erstmal an etwas Einfacherem. Vor allem vernünftigem C++. Du scheinst leider in den Genuss eines "C++ ist C mit Klassen"-Lehrers gekommen zu sein, der viel von Zeigern erzählt hat. Weder scheinst du diese Zeiger richtig verstanden zu haben, noch würde der Code in dogmatischeren C++ auch nur entfernt so aussehen. Da hättest du so gut wie keine Zeiger, zumindest keine die so direkt sichtbar sind. Und falls doch direkt sichtbar, dann mit ganz klarer Ansage, wie die Besitzverhältnisse sind.

    Also kann ich über eine Static Funktion unmöglich werte außerhalb von Static ansprechen selbst wenn ich extra Pointer verwende :(?

    Das heißt ich muss diese Funktion zum laufen bringen ohne das da Static steht 🙄 Da bin ich echt überfragt wie ich das jetzt hinzauber.
    Und ja ich übernehme mich wirklich das ist meine Art zu lernen 😋


  • Mod

    Tim schrieb:

    Also kann ich über eine Static Funktion unmöglich werte außerhalb von Static ansprechen selbst wenn ich extra Pointer verwende :(?

    😕 Erklär mal, was du denkst, was static bedeutet. Da das Wort je nach Kontext was anderes bedeutet, gehört zu einer Erklärung natürlich auch dazu, was es in welchem Zusammenhang bedeutet.

    Und ja ich übernehme mich wirklich das ist meine Art zu lernen 😋

    Dann lass das doch. Du scheinst sehr verwirrt zu sein und weniger als die Hälfte der Sachen zu verstehen, die du da überhaupt tust. Deswegen funktioniert es auch nicht.
    Ich nehme mal an, hier soll ein konkretes Problem gelöst werden. Wenn du den SQL-Kram erst einmal komplett ignorierst und anhand des üblichen Lernprogramms erst einmal die Grundlagen lernst, dann lösen sich deine Probleme nach ein paar Wochen von ganz alleine. Wenn du ohne Ahnung was du tust dein Programm weiter schreibst, dann kommt nur Murks dabei raus und du lernst dabei noch nicht einmal, wie es richtig geht.



  • SeppJ schrieb:

    Erklär mal, was du denkst, was static bedeutet.

    Static ist das, was man hinschreibt, wenn man ein Callback haben möchte und der Compiler meckert 😉

    @Tim:
    Du musst das Objekt, auf dem du arbeiten möchtest, über den data-Parameter der Callback-Funktion hineinreichen. Du hast dir anscheinend irgendwas zusammengereimt, wozu das data gut ist, das war Unsinn. Es dürfte ungefähr so gehen (vom Prinzip her, ich hab jetzt nicht gecheckt, welche Callback-Schnittstelle SQLite tatsächlich erwartet...)

    void count(){
          sql = "SELECT count(*) FROM Serien";
          /* Execute SQL statement */
          rc = sqlite3_exec(db, sql, COUNTcallback, this, &zErrMsg);
       }// COUNT
    
       static int COUNTcallback(void *data, int argc, char **argv, char **azColName){
            databaselite* instance = static_cast<databaselite*>(data);
    
            for(int i=0; i<argc; i++){ }
            cout << endl << "-->" << **argv << endl;
            // EINE ZEILE WEITER UNTEN IST DAS PROBLEM
    
            instance->versuch = atoi (*argv);
    
            return 0;
        }
    

    Falls du nicht weißt, was der this-Zeiger ist, schau dir das zuerst an, sonst verstehst du nicht, was ich da gemacht habe.



  • Bashar schrieb:

    SeppJ schrieb:

    Erklär mal, was du denkst, was static bedeutet.

    Static ist das, was man hinschreibt, wenn man ein Callback haben möchte und der Compiler meckert 😉

    @Tim:
    Du musst das Objekt, auf dem du arbeiten möchtest, über den data-Parameter der Callback-Funktion hineinreichen. Du hast dir anscheinend irgendwas zusammengereimt, wozu das data gut ist, das war Unsinn. Es dürfte ungefähr so gehen (vom Prinzip her, ich hab jetzt nicht gecheckt, welche Callback-Schnittstelle SQLite tatsächlich erwartet...)

    void count(){
          sql = "SELECT count(*) FROM Serien";
          /* Execute SQL statement */
          rc = sqlite3_exec(db, sql, COUNTcallback, this, &zErrMsg);
       }// COUNT
     
       static int COUNTcallback(void *data, int argc, char **argv, char **azColName){
            databaselite* instance = static_cast<databaselite*>(data);
    
            for(int i=0; i<argc; i++){ }
            cout << endl << "-->" << **argv << endl;
            // EINE ZEILE WEITER UNTEN IST DAS PROBLEM
     
            instance->versuch = atoi (*argv);
     
            return 0;
        }
    

    Falls du nicht weißt, was der this-Zeiger ist, schau dir das zuerst an, sonst verstehst du nicht, was ich da gemacht habe.

    Sry das ich mich so spät melde ich war schulisch leider stark abgelenkt.

    Das mit dem This Zeiger ist ne super Idee aber leider komme ich nun zu einem alten Problem wieder zurück.

    Ich bekomm, wenn ich deinen Code ausführe am ende immer ein Segmentation fault raus.
    http://de.wikipedia.org/wiki/Schutzverletzung

    Was das ist glaube ich zu wissen aber naja ich arbeite mal weiter und werd am besten Morgen nochmal alles schön ordentlich machen.
    Auch wenn ich mir das wirklich schwer bei sqlite3 vorstelle.

    NIEMALS AUFGEBEN 😃



  • Wäre nicht die einfachste Lösung anstatt schwachsinnig von int main(argc,argv) zu nutzen ein eigenes in der Klasse zu erstellen 😮?


  • Mod

    Tim schrieb:

    Wäre nicht die einfachste Lösung anstatt schwachsinnig von int main(argc,argv) zu nutzen ein eigenes in der Klasse zu erstellen 😮?

    Falls du noch ein paar Objekte in deinen Satz einfügst, kann man vielleicht sogar verstehen, was du wissen möchtest.



  • Entschuldige ich wurde von Freunden zum Döner futtern abgeholt und hab nicht nachgelesen was ich da vorhin getippt habe.
    Aber ich hab immerhin eine freudige Nachricht.

    Ich hab mein Problem selbstständig gelößt.

    #ifndef DATABASE_H_INCLUDED
    #define DATABASE_H_INCLUDED
    #include <sqlite3.h>
    #include <iostream>
    
    using namespace std;
    
    class database{
    private:
        int argc;
        char* argv[];
        sqlite3 *db;
        char *zErrMsg = 0;
        int rc;
        char *sql;
        const char* data = "Callback function called";
    
    public:
    
       //  database(sqlite3 *wusch){db = wusch;};
        static int callback(void *data, int argc, char **argv, char **azColName){
            int i;
           // cout << "CALLBACK FUNKTION AUFGERUFEN\n";
            for(i=0; i<argc; i++){
                cout << azColName[i] << " = " << argv[i] << "\n";
            }
            cout << "\n";
            return 0;
        }
    
        void open_database(){
            rc = sqlite3_open("test.db", &db);
    
            if( rc ){
                cout << "Datenbank kann nicht geöffnet werden: " << sqlite3_errmsg(db);
            }else{
                cout <<  "Datenbank wurde erfolgreich geöffnet\n";
        }
        }
    
        void select(){
               sql = "SELECT * from Serien";
    
                /* Execute SQL statement */
                rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
                if( rc != SQLITE_OK ){
                    cout << "SQL error: " << zErrMsg << "\n";
                    sqlite3_free(zErrMsg);
                }else{
                cout << "Operation wurde erfolgreich ausgeführt\n";
                }
        }
    
        void count(){
                sql = "SELECT count(*) FROM Serien";
                /* Execute SQL statement */
                rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
                if( rc != SQLITE_OK ){
                    cout << "SQL error: " << zErrMsg << "\n";
                    sqlite3_free(zErrMsg);
                }else{
                cout << "Operation wurde erfolgreich ausgeführt\n";
                }
        }
    
    };
    
    #endif // DATABASE_H_INCLUDED
    

    Das ist zu 100% nicht perfekt aber es funktioniert 🙂



  • Naja "gelöst" ist da wohl relativ. Du hast einfach den schwierigen Teil weggelöscht.



  • Bashar schrieb:

    Naja "gelöst" ist da wohl relativ. Du hast einfach den schwierigen Teil weggelöscht.

    Das ist wahr aber mir war einfach nicht klar wie unnützt schwer ich es mir vor ner Woche gemacht habe.



  • Stimmt, könnte ja sein, dass man aus Versehen was lernt. 😕



  • An Zeile 29 merk ich. Ich hab immer noch das selbe Problem 🙄
    Peinlich peinlich von mir.

    Ich lese jetzt zur Sicherheit nochmal nach wofür Static steht auch, wenn ich nicht glaube das mir das weiter hilft.

    #ifndef DATABASE_H_INCLUDED
    #define DATABASE_H_INCLUDED
    #include <sqlite3.h>
    #include <iostream>
    
    using namespace std;
    
    class database{
    private:
        int argc;
        char* argv[];
        sqlite3 *db;
        char *zErrMsg = 0;
        int rc;
        char *sql;
        const char* data = "Callback function called";
    
        int dusche;
    
    public:
    
       //  database(sqlite3 *wusch){db = wusch;};
        static int callback(void *data, int argc, char **argv, char **azColName){
            int i;
           // cout << "CALLBACK FUNKTION AUFGERUFEN\n";
            for(i=0; i<argc; i++){
                cout << azColName[i] << " = " << argv[i] << "\n";
            }
            dusche = 33;
            cout << "\n";
            return 0;
        }
    
        void open_database(){
            rc = sqlite3_open("test.db", &db);
    
            if( rc ){
                cout << "Datenbank kann nicht geöffnet werden: " << sqlite3_errmsg(db);
            }else{
                cout <<  "Datenbank wurde erfolgreich geöffnet\n";
        }
        }
    
        void select(){
               sql = "SELECT * from Serien";
    
                /* Execute SQL statement */
                rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
                if( rc != SQLITE_OK ){
                    cout << "SQL error: " << zErrMsg << "\n";
                    sqlite3_free(zErrMsg);
                }else{
                cout << "Operation wurde erfolgreich ausgeführt\n";
                }
        }
    
        void count(){
                sql = "SELECT count(*) FROM Serien";
                /* Execute SQL statement */
                rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
                if( rc != SQLITE_OK ){
                    cout << "SQL error: " << zErrMsg << "\n";
                    sqlite3_free(zErrMsg);
                }else{
                cout << "Operation wurde erfolgreich ausgeführt\n";
                }
        }
    
    };
    
    #endif // DATABASE_H_INCLUDED
    


  • Hab leider nichts neues für mich aus meinem Buch+Google über Static erfahren.

    Ich weiß nur eines.
    Ich hab kein Plan wieso ich in der Ccallback Funktion keine Variable aus private oder public ansprechen kann. Was für ein Weg gibt es das Ergebnis von Ccallback in eine Variable zu speichern?

    Zeile 42 <---

    #ifndef DATABASE_H_INCLUDED
    #define DATABASE_H_INCLUDED
    #include <sqlite3.h>
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    class database{
    private:
        int argc;
        char* argv[];
        sqlite3 *db;
        char *zErrMsg = 0;
        int rc;
        char *sql;
        const char* data = "Callback function called";
       int domian;
    
    public:
    
       //  database(sqlite3 *wusch){db = wusch;};
        static int callback(void *data, int argc, char **argv, char **azColName){
            int i;
           // cout << "CALLBACK FUNKTION AUFGERUFEN\n";
            for(i=0; i<argc; i++){
                cout << azColName[i] << " = " << argv[i] << "\n";
            }
            cout << "\n";
            return 0;
        }
    
            static int Ccallback(void *data, int argc, char **argv, char **azColName){
            int i;
           // cout << "CALLBACK FUNKTION AUFGERUFEN\n";
            for(i=0; i<argc; i++){
                cout << azColName[i] << " = " << argv[i] << "\n";
            }
            cout << "\n";
            domian = atoi(argv[0]);
    
            return 0;
        }
    
        void open_database(){
            rc = sqlite3_open("test.db", &db);
    
            if( rc ){
                cout << "Datenbank kann nicht geöffnet werden: " << sqlite3_errmsg(db);
            }else{
                cout <<  "Datenbank wurde erfolgreich geöffnet\n";
        }
        }
    
        void select(){
               sql = "SELECT * from Serien";
    
                /* Execute SQL statement */
                rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
                if( rc != SQLITE_OK ){
                    cout << "SQL error: " << zErrMsg << "\n";
                    sqlite3_free(zErrMsg);
                }else{
                cout << "Operation wurde erfolgreich ausgeführt\n";
                }
        }
    
        void count(){
                sql = "SELECT count(*) FROM Serien";
               /* Execute SQL statement */
                rc = sqlite3_exec(db, sql, Ccallback, (void*)data, &zErrMsg);
                if( rc != SQLITE_OK ){
                    cout << "SQL error: " << zErrMsg << "\n";
                    sqlite3_free(zErrMsg);
                }else{
                cout << "Operation wurde erfolgreich ausgeführt\n";
                }
        }
    
        void get_domian(){
            cout << "\nDOMIAN: " << domian;
        }
    
    };
    
    #endif // DATABASE_H_INCLUDED
    


  • Tim schrieb:

    Hab leider nichts neues für mich aus meinem Buch+Google über Static erfahren.

    Was hast du denn erfahren? static hat in C++ so ca. 5 verschiedene Bedeutungen, von denen dich gerade die für Membervariablen und Memberfunktionen interessiert. Das wesentliche über static weißt du, wenn du diese Frage beantworten kannst:

    [...] wieso ich in der Ccallback Funktion keine Variable aus private oder public ansprechen kann.



  • Bashar schrieb:

    Tim schrieb:

    Hab leider nichts neues für mich aus meinem Buch+Google über Static erfahren.

    Was hast du denn erfahren? static hat in C++ so ca. 5 verschiedene Bedeutungen, von denen dich gerade die für Membervariablen und Memberfunktionen interessiert. Das wesentliche über static weißt du, wenn du diese Frage beantworten kannst:

    [...] wieso ich in der Ccallback Funktion keine Variable aus private oder public ansprechen kann.

    Naja wenn ich Static vor ner Variable oder Funktion schreibe kann ich die nur in der selben Datei ansprechen.

    Und bei Static Varibalen bzw. Funktionen wo man ein Static vorne dran schreibt bleibt die Variabel/Rückgabewert erhalten.

    #include <iostream>
    
    using namespace std;
    
    int counter(void);
    
    int main()
    {
        counter();
        counter();
        counter();
        int dumm;
        dumm = counter();
        cout << "dumm ist: " << dumm;
        return 0;
    }
    
    int counter(void){
        static int ival;
        cout << "ival : " << ival << endl;
        ++ival;
        return ival;
    }
    


  • Ja, diese Bedeutungen von static gibt es auch. Wie gesagt, 5.



  • Bashar schrieb:

    Ja, diese Bedeutungen von static gibt es auch. Wie gesagt, 5.

    Wie soll ich sowas den jetzt aufzählen am Ende fehlt doch eh noch irgendwas xD
    Mach ich mal weiter fsosfjfiosjiogjiogioggigsggo0

    main.cpp

    #include <iostream>
    #include "ichbinweiblich.h"
    
    using namespace std;
    
    int sagtesmirdocheinfach::ival=0;
    
    int main()
    {
    
        cout << sagtesmirdocheinfach::langweilig(); // 1
        cout << sagtesmirdocheinfach::langweilig();
        cout << sagtesmirdocheinfach::langweilig();
    
        sagtesmirdocheinfach googlenutzerwuerdeneseuchdanken;
        googlenutzerwuerdeneseuchdanken.get_ival();
        googlenutzerwuerdeneseuchdanken.get_ival();
    
        cout << endl << sagtesmirdocheinfach::return_ival(); //2
    
    // ka was ich noch nicht erwähnt habe
    
        return 0;
    }
    

    ichbinweiblich.h

    #ifndef ICHBINWEIBLICH_H_INCLUDED
    #define ICHBINWEIBLICH_H_INCLUDED
    #include <iostream>
    using  namespace std;
    
    class sagtesmirdocheinfach{
    public:
        sagtesmirdocheinfach(){ ival++; };
        static int langweilig(){return ival;}
    
        void get_ival(){
            cout << ival << endl;
        }
    
        static int return_ival(){
            return ival;
        }
    
    private:
        static int ival;
    };
    
    #endif // ICHBINWEIBLICH_H_INCLUDED
    

Anmelden zum Antworten