从不同的c ++类访问Mysql *连接变量

时间:2013-04-08 07:48:38

标签: c++ mysql class connection friend-class

我写了c ++类来连接mysql数据库:

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;
    };

当我尝试从主函数或其他类访问连接变量时,我总是会收到错误,例如变量&#39;连接未在此范围内声明。我试图使用朋友类或继承指向连接变量,但它没有工作。我想我在语法上做错了。

以下是我尝试从不同类中指向此变量的示例:

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

2 个答案:

答案 0 :(得分:1)

MYSQL * connection;

仅将连接变量声明为构造函数的本地变量。您必须将其移动到类定义,以便以某种方式使其可用。或者,在Database对象中创建一个connect方法,以明确地创建新的连接adlib。你必须用一种近似的方法来镜像它。

另一种选择是为连接创建一个专用的类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原语。

答案 1 :(得分: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...