Доступ к переменной соединения Mysql * из другого класса c ++

Я написал класс 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;
};

Когда я пытаюсь получить доступ к переменной соединения из основной функции или из другого класса, я всегда получаю сообщение об ошибке вроде переменная связь не объявлена ​​в этой области. Я пытался использовать дружественные классы или наследование, чтобы указать на переменную соединения, но это не сработало. Я думаю, что я делаю что-то не так в моем синтаксисе.

Вот пример того, как я пытаюсь указать на эту переменную из другого класса:

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

2

Решение

Чтобы решить эту проблему, я должен был определить 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...
1

Другие решения

MYSQL * connection;

объявляет переменную соединения как локальную только для конструктора. Вы должны переместить его в определение класса, чтобы каким-то образом сделать его доступным. В качестве альтернативы, сделать 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

По вопросам рекламы [email protected]