2

mysql データベースに接続するための C++ クラスを作成しました。

hpp ファイル

#include <vector>
#include <string>

#include "mysql/mysql.h"

#ifndef _DATA
#define _DATA

class Database {

public:
    string host; 
    string user; 
    string pwd; 
    string db; 
    MYSQL * connection;
    MYSQL_RES *result;
    MYSQL_ROW row;

Database(const string & host,
         const string & user,
     const string & pwd,
     const string & db);

    int createMysqlConnection();
};
#endif

cpp ファイル

#include "Database.hpp"

Database::Database(const string & host,
           const string & user,
           const string & pwd,
           const string & db) :
    mysqlHost(host),
    mysqlUser(user),
    mysqlPassword(pwd),
    mysqlDBName(db)
{}
int Database::createMysqlConnection(){
    MYSQL * connection;
    connection = mysql_init(NULL);
               if(!mysql_real_connect(connection, mysqlHost.c_str(), mysqlUser.c_str(),
               mysqlPassword.c_str(), mysqlDBName.c_str(),
               0, NULL, 0)){
    fprintf(stderr, "Connection to database failed: %s\n",
        mysql_error(connection));
    return EXIT_FAILURE;
    }
    cout << "connected to mysql" << endl;
    };

メイン関数または別のクラスから接続変数にアクセスしようとすると、変数 '接続がこのスコープで宣言されていません のようなエラーが常に発生します。フレンド クラスまたは継承を使用して接続変数を指定しようとしましたが、うまくいきませんでした。構文で何か間違っていると思います。

別のクラスからこの変数を指す方法の例を次に示します。

Class risk: public Database {
public:
vector<sting> parameter;
Datasabse.connection;
etc....
}
4

2 に答える 2

1

この問題を解決するには、クラス コンストラクターで MYSQL 接続を定義する必要がありました。コードサンプルは次のとおりです。

class1.hpp

***headers***
class Flight { 

public:

Flight(MYSQL * connection);

MYSQL * c;

MYSQL_RES * res;

etc...

Class1.cpp

***headers***

Flight::Flight (MYSQL* connection)

{

c = connection;

};

等...

main.cpp

***headers***

int main (int argc, char *argv[]) {

Database db(localhost, user, etc..);

db.createMysqlConnection;

Flight fl(db.connection);

fl.GetIDs();

etc...
于 2013-04-10T09:36:56.027 に答える
1
MYSQL * connection;

接続変数をコンストラクターに対してのみローカルとして宣言します。何らかの形で使用できるようにするには、クラス定義に移動する必要があります。または、connectDatabase オブジェクトにメソッドを作成して、新しい接続 adlib を明示的に作成します。close メソッドを使用してミラーリングする必要があります。

さらに別のオプションはConnection、接続専用のクラスを作成することです。これにより、次のことが可能になります。

  • で構成されますMYSQL *
  • connect上記の方法で作成されDatabaseます。Databaseクラスはファクトリとして機能しConnection
  • それを処理するために必要なすべての方法を実行し、
  • mysql_close基礎となる接続の適切な終了を保証するために、そのデストラクタを呼び出します。

例えば:

class Connection {
     protected:
          MYSQL *connection;
    public:
        Connection(MYSQL *c): connection(c){}
        virtual ~Connection() { mysql_close(connection); }
        MYSQL_STMT * prepareQuery(const string &query) { 
             return mysql_prepare(connection, query.c_str(), query.length());
        }
        // other methods
};

このアプローチの問題点は、すぐにすべての API プリミティブをクラスでラップしなければならないと感じることです。

于 2013-04-08T07:59:42.950 に答える