Класс пользовательских функций MySQL - PullRequest
0 голосов
/ 17 марта 2012

Я начал работать над классом, включающим много функций, перегруппировывающих обычную задачу mysql, которая понадобится моему проекту (игровому серверу).

В данный момент есть много, поскольку я учусь использовать mysql с C ++

При попытке построить этот класс как разделяемую библиотеку (под Linux) у меня возникает ошибка, вот она ..

error: ‘connect’ was not declared in this scope

Итак .. это происходит в функции checklogin() изКонечно, я немного понимаю, что это значит, проблема в том, что этот connect объявлен в другой функции connectdb(), которую я сделал в той же библиотеке.Я попытался просто повторить указатель, но это привело меня к ошибке seg при входе в функцию checklogin (ошибка seg на самом деле происходит из библиотеки mysql, из того, что сказал отладчик), поэтому я подумал, что это может быть неправильный путь (или это было?)

В любом случае, мне было интересно, что может быть возможным решением этой проблемы, снова указать connect?или управляйте тем, что этот указатель будет обнаружен другой функцией, вот код ... (кстати, код функции был в значительной степени скопирован / вставлен из этого урока http://www.nitecon.com/tutorials-articles/develop/cpp/c-mysql-beginner-tutorial/)

sssql.cpp

    #include "sssql.h"

sssql::sssql()
{
    //ctor
}

sssql::~sssql()
{
    //dtor
}


bool sssql::checklogin(std::string, std::string)
{
    MYSQL *connect;
    MYSQL_RES *res_set;
    MYSQL_ROW row;
    mysql_query(connect,"SELECT * FROM account");

    unsigned int i = 0;

    res_set = mysql_store_result(connect);

    unsigned int numrows = mysql_num_rows(res_set);

    while ((row = mysql_fetch_row(res_set)) != NULL)
        {
        printf("%s\n",row[i] != NULL ?
        row[i] : "NULL");
        }

}

bool sssql::connectdb()
{
     MYSQL *connect;
    connect=mysql_init(NULL);
    if(!connect)
    {
        printf("MySQL Initialization Failed");
        return 1;
    }

    connect=mysql_real_connect(connect,SERVER,USER,PASSWORD,DATABASE,0,NULL,0);

    if(connect){
        printf("Connection Succeeded\n");
    }
    else{
        printf("Connection Failed!\n");
    }
}

sssql.h

#ifndef SSSQL_H
#define SSSQL_H
#include "mysql.h"
#define SERVER "localhost"
#define USER "root"
#define PASSWORD "password"
#define DATABASE "database"
#include <stdio.h>
#include <string>
class sssql
{
    public:
        sssql();
        virtual ~sssql();

        // Check login info
        std::string usrcheck;
        std::string passwd;
        bool connectdb();
        bool checklogin(std::string, std::string);
    protected:
    private:
};

#endif // SSSQL_H

1 Ответ

0 голосов
/ 20 марта 2012

Проблема с connect заключается в том, что вы создаете ее в функции connectdb, где это локальная переменная, поэтому, когда connectdb возвращает connect, уничтожается.Когда вы переименовываете его в checklogin(), вы, по сути, создаете отдельную переменную, в которой бог знает, что может быть сохранено в ней, и затем вы пытаетесь использовать ее для связи с MySQL, которая не будет работать.быть объявленным connect в качестве члена частного класса:

class sssql
{
private:
    MySQL *connect;

....
};

, что сделает его областью действия для всех функций, объявленных в классе.Вы можете создать его во время создания или в отдельной функции, например, connectdb(), если захотите.Но прежде чем продолжить, я настоятельно рекомендую прочесть область видимости переменной и другие учебные пособия того же сайта .

PS Еще одно предложение - не называть переменнуюconnect так как есть функции в нескольких библиотеках под одним и тем же именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...