2012-03-17 81 views
0

我开始研究一个类,其中包括我的项目(游戏服务器)需要的许多重新组合通用mysql任务的函数。自定义MySQL函数类

现在有isint因为我正在学习如何使用C++

的MySQL虽然试图建立这个类作为共享库(Linux下)我有一个错误,这是非常..

error: ‘connect’ was not declared in this scope 

所以..它发生在函数checklogin()当然我有点明白它是什么意思,问题是这connect是在另一个函数connectdb()中声明,我在同一个库中。我试图重复指针的事情,但是当我输入checklogin函数(seg fault actualy来自mysql库,从调试器所说的)时,它会导致我出现seg故障,所以我认为它可能不是正确的方法(或是否?)

无论如何,我想知道什么可以解决这个问题,再次指向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 

回答

0

connect的问题是,你在connectdb函数创建它是一个局部变量,所以一旦connectdb回报connect是德stroyed。当你在checklogin()中重新声明它时,你实际上与上帝创建一个单独的变量只知道可以存储在其中的内容,然后尝试使用它与MySQL进行通信,这将不起作用。

什么,你应该做的是,宣布connect为私有类成员:

class sssql 
{ 
private: 
    MySQL *connect; 

.... 
}; 

这将使它的范围在类中声明的所有功能。如果您选择,您可以在施工期间或在单独的功能(如connectdb())中对其进行实例化。但在继续之前,我强烈建议您阅读variable scope以及其他来自the same site的教程。

P.S.还有一个建议是不要命名变量connect,因为在同名的几个库中有函数。