const std :: string распространение ошибки аргумента в конструкторе

Я учусь пользоваться Wt (остроумной) библиотекой C ++ и пытался импровизировать на Dbo :: Session с синглтоном. Ниже приведен фрагмент созданной мной оболочки MySQL Backend Singleton.

Дело об отказе

Программа компилируется и запускается с исключением: MySQL Connect Failure.

На отладке с GDB выяснилось, что значение вар dbhost в //BREAKPOINT было "localhost" однако в //STEP1 значение было мусором.

наблюдения

Wt :: Dbo API своеобразно показывает, что конструктор класса MySQL имеет только один строковый аргумент, который не передается по ссылке const std::string dbhost, Подпись функции из заголовочного файла

MySQL(const std::string &db, const std::string &dbuser="root",
const std::string &dbpasswd="", const std::string dbhost="localhost",
unsigned int dbport = 0,
const std::string &dbsocket ="/var/run/mysqld/mysqld.sock",
int fractionalSecondsPart = -1);

Случай успеха

Тот же код только с тремя аргументами, передаваемыми конструктору суперкласса

MySQL(db, dbuser, dbpasswd) // like this

возвращает желаемый объект MySQL для кода.

Требуется помощь в понимании поведения и решении проблемы.

Ниже приведен код, используемый для компиляции

#ifndef CANDBM_MODEL_MYSQL_SINGLETON_H
#define CANDBM_MODEL_MYSQL_SINGLETON_H

#include <Wt/Dbo/Dbo>
#include <Wt/Dbo/backend/MySQL>

namespace dbo = Wt::Dbo;

namespace Candbm { namespace Model {

class MysqlSingleton : public dbo::backend::MySQL
{
private:

static std::string const DB_NAME;
static std::string const DB_USER;
static std::string const DB_PASS;
static std::string const DB_HOST;
static int const DB_PORT;

static MysqlSingleton* mysql;

MysqlSingleton(
const std::string& db,
const std::string& dbuser = "root",
const std::string& dbpass = "",
const std::string dbhost = "localhost",
unsigned int dbport = 0,
const std::string& dbsocket = "/var/run/msyqld/mysqld.sock",
int fractionalSecondsPart = -1
)
: MySQL(db, dbuser, dbpass, dbhost, dbport, dbsocket, // STEP 1
fractionalSecondsPart
) {}
MysqlSingleton(MysqlSingleton const& m) : dbo::backend::MySQL(m) {}
MysqlSingleton operator=(MysqlSingleton const&);

public:
static MysqlSingleton* getBackend() { return instance(); }
static MysqlSingleton* instance();
};

std::string const MysqlSingleton::DB_NAME = "wt_candbm";
std::string const MysqlSingleton::DB_USER = "wtcandbm";
std::string const MysqlSingleton::DB_PASS = "somedummyvalue";
std::string const MysqlSingleton::DB_HOST = "localhost";
int const MysqlSingleton::DB_PORT = 0;
MysqlSingleton* MysqlSingleton::mysql = NULL;

MysqlSingleton* MysqlSingleton::instance()
{
if (!mysql)
{ // BREAKPOINT 1
// EDIT 1: commented the following line
// static std::string dbhost(DB_HOST.begin(), DB_HOST.end());
// EDIT 2: the constant directly passed here ,,,,,,,
mysql = new MysqlSingleton(DB_NAME, DB_USER, DB_PASS, DB_HOST, DB_PORT);
mysql->setProperty("show-queries", "true");
}
return mysql;
}

} }

#endif

Обновления:

  1. EDIT 1:2: Эти два редактирования упрощают код, как предложено @dma. И теперь мусор получается при следующем вызове конструктора. Т.е. следующий шаг в отладчике в файле MySQL.C

2

Решение

Задача ещё не решена.

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


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