0

手順:
-Mysql Server2005をインストール
しました-Mysql++をダウンロードし、デバッグバージョンとリリースバージョンの両方をビルドしました。
--install.htaを実行し、ディレクトリを選択しました-MSVC
++2008にlibrary/includeディレクトリを追加しました-
アプリケーションにmysql++。hを
含めました-.dllファイル(libMYSQL.dllとmysqlpp.dllおよびmysqlpp_d.dll)をDebugフォルダーに移動しました。

関連コード:

#include "mysql++.h"

class Database {

private:

    mysqlpp::Connection* conn;

public:

    ~Database();
    bool Connect(char* ip, char* user, char* pass, char* db);

};

bool Database::Connect(char* ip, char* user, char* pass, char* db) {
    conn = new mysqlpp::Connection(false);
    return conn->connect(db, ip, user, pass);
}

Database::~Database() {
    if(conn) {
        delete[] conn;
    }
}

問題:

Database db;
db.Connect("127.0.0.1", "root", "mypassword", "mydb");

MySQL Administratorでまったく同じクレデンシャルを使用していて正しくログインしている場合でも、これは常にfalseに戻ります。

ヘルプ :(

4

2 に答える 2

2

私はこのポインタを作りません:

mysqlpp::Connection* conn;

クラスの通常のメンバーにするだけです。

mysqlpp::Connection conn;

これにはいくつかの利点があります。
しかし、最も重要なことは、浅いコピーの問題を回避することです。

ルール 4:

オブジェクトが RAW ポインターの所有者である場合、メモリ管理を正しく処理するために、次の 4 つのメンバーを定義する必要があります。

* Constructor
* Copy Constructor
* Assignment Operator
* Destructor

これは、それらを定義しない場合、コンパイラが上記のメソッドを自動的に生成するためです。ほとんどの場合、これらは機能しますが、所有する RAW ポインターがオブジェクトに含まれている (つまり、削除した) 場合、これらのメソッドのコンパイラー生成バージョンでは事態がひどく悪化します。

于 2009-01-05T18:45:52.803 に答える
0

また、char ポインターではなく文字列を使用します。

bool Database::Connect(char* ip, char* user, char* pass, char* db)

試す:

Database::Database(std::string const& ip,
                   std::string const& user,
                   std::string const& pass,
                   std::string const& db)

メソッド Connect() から constructor() にコードを移動すると、オブジェクトを常に有効にすることができます。

于 2009-01-05T18:55:33.970 に答える