簡體   English   中英

錯誤:從&#39;int(*)(std :: list <myclass*> ,int,char **,char **)&#39;到&#39;int(*)(void *,int,char **,char **)&#39;

[英]error: invalid conversion from ‘int (*)(std::list<myclass*>, int, char**, char**)’ to ‘int (*)(void*, int, char**, char**)’

我會盡量簡潔。 好吧,我得到了一個項目,其目標是

  1. 使用C ++訪問Sqlite3數據庫。
  2. 使一個類具有用於執行不同類型的SQLite查詢的成員函數。
  3. 完成上述操作后,使用main()中的STL創建一個List容器,並獲取存儲為列表中單獨對象的每條記錄。 因此,當用戶嘗試使用預定義的SQLite查詢訪問數據庫的記錄時,他將僅訪問列表容器,而不訪問數據庫。
  4. 一旦在main()函數中完成了上述操作,就將所有這些代碼轉移到一個類成員函數中。 並在main()中調用此特定函數,以獲取我們將從AIM-(3)獲得的確切輸出

因此,在此基礎上,我創建了一個位於DBsqlite文件夾(PATH- / DBsqlite3 / foreign_key.db)中的數據庫foreign_key.db。

注意: emp_info架構如下:

  CREATE TABLE emp_info(
  SR_NO INT ,
  NAME CHAR(32) NOT NULL,
  AGE INT(4) NOT NULL CHECK(AGE > 16),
  SEX CHAR (6) NOT NULL,
  ADDRESS CHAR(70),
  EMPID INT NOT NULL CHECK(EMPID>300) UNIQUE,
  CARDID TEXT NOT NULL UNIQUE,
  SALARY INT CHECK(SALARY>10000) NOT NULL,
  MOBILE_NO INT(16) UNIQUE,
  EMAIL_ID TEXT(32) UNIQUE,
  BDT INT,
  PHOTO BLOB );

emp_info表中的條目如下(我刪除了一些列以使其看起來更好):

 SR_NO  NAME AGE  SEX   ADDRESS    EMPID  CARDID    SALARY    
  1     AAA  35  MALE   A1A2A3A4   301    1111AAA   11111    
  2     BBB  36  FEMALE B1B2B3B4   302    2222BBB   22222    
  3     CCC  37  FEMALE C1C2C3C4   303    3333CCC   33333    
  4     DDD  38  MALE   D1D2D3D4   304    4444DDD   44444    
  5     EEE  39  MALE   E1E2E3E4   305    5555EEE   55555    
  6     FFF  40  MALE   F1F2F3F4   306    6666FFF   66666    
  7     GGG  41  MALE   G1G2G3G4   307    7777GGG   77777    
  8     HHH  42  FEMALE H1H2H3H4   308    8888HHH   88888    
  9     III  43  FEMALE I1I2I3I4   309    9999IIII  99999`

我用C ++編寫了以下程序來實現AIM-(1)和AIM-(2)。 下面的程序還創建一個LIST CONTAINER來顯示每個sqlite查詢的值。

#include <iostream>
#include <list>
#include <string>
#include <sqlite3.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

class Employee{

    int SR_NO;
    int AGE;
    int EMPID;
    int CARDID;
    int SALARY;
    int MOBILE_NO;
    int BDT;

    char NAME;
    char SEX;
    char ADDRESS;

};

class sqliteDB{

private:
    int rc;
    sqlite3 *db;
    char *zErrMsg;
    const char *sql;

public:

    static int callback(void *NotUsed, int argc, char **argv, char **azColName)
    {
        int i;
        cout << "Number of args= " << argc << endl;

        for(i=0; i<argc; i++)
        {
            cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << endl;
        }
        cout << endl;
        return 0;
    }


    bool connectDB()
    {

        rc = sqlite3_open("/DBsqlite3/foreign_key.db", &db);
        if( rc )
        {
            cerr << "Can't open database: " << sqlite3_errmsg(db) << endl;
            sqlite3_close(db);
            exit(1);
        }
        else
        {
            std::cout<<"\n\nDatabase opened successfully\n\n";
        }
        return 0;
    }


    bool allEmp()
    {   //NOTE- BELOW IS LINE 99
        rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, 0, &zErrMsg);
        if( rc!=SQLITE_OK )
        {
            cerr << "SQL error: " << zErrMsg << endl;
            sqlite3_free(zErrMsg);
        }

        sqlite3_close(db);
    }
};

int main()
{      

    list<sqliteDB> employee_info;
   // Read from database from below//

      for (int i=0; i<1; i++)
      {
         sqliteDB object2;
         object2.connectDB();
         employee_info.push_back(object2);
      }



    list<sqliteDB>::iterator i;
    for (i = employee_info.begin(); i != employee_info.end(); i++)
    {
        if (! i -> allEmp())
        cout<< i->allEmp() << endl;
     cout << " size of Object inside List is: " << employee_info.size() << '\n';
    }

}

以上結果為:

Database opened successfully

Number of args= 12
SR_NO = 7
NAME = GGG
AGE = 41
SEX = MALE
ADDRESS = G1G2G3G4
EMPID = 307
CARDID = 7777GGG
SALARY = 77777
MOBILE_NO = 9833446677
EMAIL_ID = abi@gmail.com
BDT = 07:08:1947PHOTO = NONE

Number of args= 12
SR_NO = 8
NAME = HHH
AGE = 42
SEX = FEMALE
ADDRESS = H1H2H3H4
EMPID = 308
CARDID = 8888HHH
SALARY = 88888
MOBILE_NO = 9833446688
EMAIL_ID = abj@gmail.com
BDT = 08:09:1947
PHOTO = NONE

Number of args= 12
SR_NO = 9
NAME = III
AGE = 43
SEX = FEMALE
ADDRESS = I1I2I3I4
EMPID = 309
CARDID = 9999IIII
SALARY = 99999
MOBILE_NO = 9833446699
EMAIL_ID = abk@gmail.com
BDT = 09:10:1947
PHOTO = NONE

SQL error: 21
size of Object inside List is: 1

雖然,我能夠看到3個sqlite查詢的結果。 但是在列表中創建的對象僅為1(結果的最后一行中注-)。 我希望它是3個對象

我希望List容器將每個有效記錄(行)作為單獨的列表對象存儲在Employee類中。用戶可以訪問顯示記錄的每個字段/列。

我該如何實現? 非常感謝您的幫助。 如果您通過基於此問題的示例演示如何做到這一點,將不勝感激。

謝謝

更新-使用WhozCraig的建議解決方案,我更改了以下內容:

變更1聲明了另一個列表容器Employee:

list<Employee*> employee_info;

變更2將此列表替換為空*未使用

static int callback(list<Employee*> employee_info2, int argc, char **argv, char **azColName)

Change-3回調函數的主要變化

Employee *obj_emp = new Employee;
        int i;
        cout << "Number of args= " << argc << endl;

            obj_emp->SR_NO=(argv[0] ? argv[0] : "NULL");
            obj_emp->NAME=(argv[1] ? argv[1] : "NULL");
            obj_emp->AGE=(argv[2] ? argv[2] : "NULL");
            obj_emp->SEX=(argv[3] ? argv[3] : "NULL");
            obj_emp->ADDRESS=(argv[4] ? argv[4] : "NULL");
            obj_emp->EMPID=(argv[5] ? argv[5] : "NULL");
            obj_emp->CARDID=(argv[6] ? argv[6] : "NULL");
            obj_emp->SALARY=(argv[7] ? argv[7] : "NULL");
            obj_emp->MOBILE_NO=(argv[8] ? argv[8] : "NULL");
            obj_emp->BDT=(argv[10] ? argv[10] : "NULL");

          employee_info2.push_back(obj_emp);

     cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << endl;

        cout << endl;
        return 0;

整個程序

#include <iostream>
#include <list>
#include <string>
#include <sqlite3.h>
#include <stdlib.h>

using namespace std;

class Employee{

public:

string SR_NO;
string AGE;
string EMPID;
string CARDID;
string SALARY; 
string MOBILE_NO;
string BDT;

string NAME;
string SEX;
string ADDRESS;

};

class sqliteDB{

private:
int rc;
sqlite3 *db;
char *zErrMsg;
const char *sql;

public:

//  list<Employee> employee_info2; //this line vector<Employee> *employee_info2; defines a pointer to a vector 
                                   //of type Employee and not a vector of type Employee pointers
    list<Employee*> employee_info2;


    static int callback(list<Employee*> employee_info2, int argc, char **argv, char **azColName)
     {
    Employee *obj_emp = new Employee;
        int i;
        cout << "Number of args= " << argc << endl;


            obj_emp->SR_NO=(argv[0] ? argv[0] : "NULL");
            obj_emp->NAME=(argv[1] ? argv[1] : "NULL");
            obj_emp->AGE=(argv[2] ? argv[2] : "NULL");
            obj_emp->SEX=(argv[3] ? argv[3] : "NULL");
            obj_emp->ADDRESS=(argv[4] ? argv[4] : "NULL");      
            obj_emp->EMPID=(argv[5] ? argv[5] : "NULL");
            obj_emp->CARDID=(argv[6] ? argv[6] : "NULL");
            obj_emp->SALARY=(argv[7] ? argv[7] : "NULL");
            obj_emp->MOBILE_NO=(argv[8] ? argv[8] : "NULL");
            obj_emp->BDT=(argv[10] ? argv[10] : "NULL");


          employee_info2.push_back(obj_emp);


            cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << endl;

        cout << endl;
        return 0;
      }


bool connectDB()
{

      rc = sqlite3_open("/DBsqlite3/foreign_key.db", &db);
      if( rc )
      {
        cerr << "Can't open database: " << sqlite3_errmsg(db) << endl;
        sqlite3_close(db);
        exit(1);
      }
      else
      {
            std::cout<<"\n\nDatabase opened successfully\n\n";
      }
     return 0;
}


  bool allEmp()
  {
      sqliteDB object2;
      object2.connectDB();                 
      //NOTE- BELOW IS LINE 99
      rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, 0, &zErrMsg);
      if( rc!=SQLITE_OK )
      {
          cerr << "SQL error: " << zErrMsg << endl;
          sqlite3_free(zErrMsg);
      }

      sqlite3_close(db);

    }
};

int main()
{     
   sqliteDB object1;
   object1.connectDB();
   object1.allEmp();
}

編譯錯誤后,我得到的是:

example1.cpp: In member function ‘bool sqliteDB::allEmp()’:
example1.cpp:99:95: error: invalid conversion from ‘int (*)(std::list<Employee*>, int, char**, char**)’ to ‘int (*)(void*, int, char**, char**)’ [-fpermissive]
       rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, 0, &zErrMsg);

我接下來該怎么辦? 請幫助

您正在嘗試將函數指針傳遞給錯誤類型的sqlite3_exec函數。 您需要將回調的簽名改回原來的方式。

static int callback(void *param, int argc, char **argv, char **azColName)

然后,您應該適當調用sqlite3_exec 像這樣:

rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, &employee_info2, &zErrMsg);

最后,在回調中,將param回正確的類型。

std::list<Employee*>& employee_info2 = std::reinterpret_cast<std::list<Employee*>&>(*param);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM