Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抽象数据库在C+中的实现+;_C++ - Fatal编程技术网

C++ 抽象数据库在C+中的实现+;

C++ 抽象数据库在C+中的实现+;,c++,C++,我想通过从Db继承创建抽象Db类并实现Pg(postgresql): Db.h: template <class T> class Db { public: Db(std::string, std::string, std::string, std::string); virtual ~Db(); protected: T* getConnection(); std::string getHost(); std::string getUse

我想通过从Db继承创建抽象Db类并实现Pg(postgresql):

Db.h

template <class T>
class Db 
{
public:
    Db(std::string, std::string, std::string, std::string);
    virtual ~Db();

protected:
    T* getConnection();
    std::string getHost();
    std::string getUsername();
    std::string getDatabase();
    std::string getPassword();
    virtual std::string getConnectionString()=0;

private: 
    T* connection;
    std::string host;
    std::string username;
    std::string database;
    std::string password;
};
#include "Db.h"

using namespace std;

template <class T>
Db<T>::Db(string iHost, string iUsername, string iDatabase, string iPassword) 
    : host(iHost), username(iUsername), database(iDatabase), password(iPassword) {
    T* conn(getConnectionString());
    connection = conn;
}

template <class T>
T* Db<T>::getConnection() {
    return connection;
}

... getters
#include "../Db.h"

template <class T>
class Pg : public Db<T> {
public:
    virtual std::string getConnectionString();
};
#include "Pg.h"

template <class T>
std::string Pg<T>::getConnectionString() {
    return "host=" + this->getHost() + " user=" + this->getUsername() 
        + " password=" + this->getPassword() + " dbname=" + this->getDatabase();
}
#include <iostream>
#include <pqxx/connection>
#include <pqxx/transaction>
#include "lib/db/pg/Pg.h"

using namespace std;

int main () {
    string host     = "localhost";
    string username = "username";
    string database = "db";
    string password = "root";

    try {
        Pg<pqxx::connection> *db(host, username, database, password);
    } catch (pqxx::broken_connection) {
        cout << "Failed to establish connection." << endl;
    }

    return 0;
}
模板
Db类
{
公众:
Db(标准::字符串,标准::字符串,标准::字符串,标准::字符串);
虚拟~Db();
受保护的:
T*getConnection();
std::string getHost();
std::string getUsername();
std::string getDatabase();
std::string getPassword();
虚拟std::string getConnectionString()=0;
私人:
T*连接;
std::字符串主机;
std::字符串用户名;
字符串数据库;
std::字符串密码;
};
Db.cpp

template <class T>
class Db 
{
public:
    Db(std::string, std::string, std::string, std::string);
    virtual ~Db();

protected:
    T* getConnection();
    std::string getHost();
    std::string getUsername();
    std::string getDatabase();
    std::string getPassword();
    virtual std::string getConnectionString()=0;

private: 
    T* connection;
    std::string host;
    std::string username;
    std::string database;
    std::string password;
};
#include "Db.h"

using namespace std;

template <class T>
Db<T>::Db(string iHost, string iUsername, string iDatabase, string iPassword) 
    : host(iHost), username(iUsername), database(iDatabase), password(iPassword) {
    T* conn(getConnectionString());
    connection = conn;
}

template <class T>
T* Db<T>::getConnection() {
    return connection;
}

... getters
#include "../Db.h"

template <class T>
class Pg : public Db<T> {
public:
    virtual std::string getConnectionString();
};
#include "Pg.h"

template <class T>
std::string Pg<T>::getConnectionString() {
    return "host=" + this->getHost() + " user=" + this->getUsername() 
        + " password=" + this->getPassword() + " dbname=" + this->getDatabase();
}
#include <iostream>
#include <pqxx/connection>
#include <pqxx/transaction>
#include "lib/db/pg/Pg.h"

using namespace std;

int main () {
    string host     = "localhost";
    string username = "username";
    string database = "db";
    string password = "root";

    try {
        Pg<pqxx::connection> *db(host, username, database, password);
    } catch (pqxx::broken_connection) {
        cout << "Failed to establish connection." << endl;
    }

    return 0;
}
#包括“Db.h”
使用名称空间std;
模板
Db::Db(字符串iHost、字符串iUsername、字符串iDatabase、字符串iPassword)
:主机(iHost)、用户名(iUsername)、数据库(iDatabase)、密码(iPassword){
T*conn(getConnectionString());
连接=连接;
}
模板
T*Db::getConnection(){
回路连接;
}
... 吸气剂
Pg.h

template <class T>
class Db 
{
public:
    Db(std::string, std::string, std::string, std::string);
    virtual ~Db();

protected:
    T* getConnection();
    std::string getHost();
    std::string getUsername();
    std::string getDatabase();
    std::string getPassword();
    virtual std::string getConnectionString()=0;

private: 
    T* connection;
    std::string host;
    std::string username;
    std::string database;
    std::string password;
};
#include "Db.h"

using namespace std;

template <class T>
Db<T>::Db(string iHost, string iUsername, string iDatabase, string iPassword) 
    : host(iHost), username(iUsername), database(iDatabase), password(iPassword) {
    T* conn(getConnectionString());
    connection = conn;
}

template <class T>
T* Db<T>::getConnection() {
    return connection;
}

... getters
#include "../Db.h"

template <class T>
class Pg : public Db<T> {
public:
    virtual std::string getConnectionString();
};
#include "Pg.h"

template <class T>
std::string Pg<T>::getConnectionString() {
    return "host=" + this->getHost() + " user=" + this->getUsername() 
        + " password=" + this->getPassword() + " dbname=" + this->getDatabase();
}
#include <iostream>
#include <pqxx/connection>
#include <pqxx/transaction>
#include "lib/db/pg/Pg.h"

using namespace std;

int main () {
    string host     = "localhost";
    string username = "username";
    string database = "db";
    string password = "root";

    try {
        Pg<pqxx::connection> *db(host, username, database, password);
    } catch (pqxx::broken_connection) {
        cout << "Failed to establish connection." << endl;
    }

    return 0;
}
#包括“./Db.h”
模板
类别Pg:公共数据库{
公众:
虚拟std::string getConnectionString();
};
Pg.cpp

template <class T>
class Db 
{
public:
    Db(std::string, std::string, std::string, std::string);
    virtual ~Db();

protected:
    T* getConnection();
    std::string getHost();
    std::string getUsername();
    std::string getDatabase();
    std::string getPassword();
    virtual std::string getConnectionString()=0;

private: 
    T* connection;
    std::string host;
    std::string username;
    std::string database;
    std::string password;
};
#include "Db.h"

using namespace std;

template <class T>
Db<T>::Db(string iHost, string iUsername, string iDatabase, string iPassword) 
    : host(iHost), username(iUsername), database(iDatabase), password(iPassword) {
    T* conn(getConnectionString());
    connection = conn;
}

template <class T>
T* Db<T>::getConnection() {
    return connection;
}

... getters
#include "../Db.h"

template <class T>
class Pg : public Db<T> {
public:
    virtual std::string getConnectionString();
};
#include "Pg.h"

template <class T>
std::string Pg<T>::getConnectionString() {
    return "host=" + this->getHost() + " user=" + this->getUsername() 
        + " password=" + this->getPassword() + " dbname=" + this->getDatabase();
}
#include <iostream>
#include <pqxx/connection>
#include <pqxx/transaction>
#include "lib/db/pg/Pg.h"

using namespace std;

int main () {
    string host     = "localhost";
    string username = "username";
    string database = "db";
    string password = "root";

    try {
        Pg<pqxx::connection> *db(host, username, database, password);
    } catch (pqxx::broken_connection) {
        cout << "Failed to establish connection." << endl;
    }

    return 0;
}
#包括“Pg.h”
模板
std::string Pg::getConnectionString(){
return“host=“+this->getHost()+”user=“+this->getUsername())
+“password=“+this->getPassword()+”dbname=“+this->getDatabase();
}
main.cpp

template <class T>
class Db 
{
public:
    Db(std::string, std::string, std::string, std::string);
    virtual ~Db();

protected:
    T* getConnection();
    std::string getHost();
    std::string getUsername();
    std::string getDatabase();
    std::string getPassword();
    virtual std::string getConnectionString()=0;

private: 
    T* connection;
    std::string host;
    std::string username;
    std::string database;
    std::string password;
};
#include "Db.h"

using namespace std;

template <class T>
Db<T>::Db(string iHost, string iUsername, string iDatabase, string iPassword) 
    : host(iHost), username(iUsername), database(iDatabase), password(iPassword) {
    T* conn(getConnectionString());
    connection = conn;
}

template <class T>
T* Db<T>::getConnection() {
    return connection;
}

... getters
#include "../Db.h"

template <class T>
class Pg : public Db<T> {
public:
    virtual std::string getConnectionString();
};
#include "Pg.h"

template <class T>
std::string Pg<T>::getConnectionString() {
    return "host=" + this->getHost() + " user=" + this->getUsername() 
        + " password=" + this->getPassword() + " dbname=" + this->getDatabase();
}
#include <iostream>
#include <pqxx/connection>
#include <pqxx/transaction>
#include "lib/db/pg/Pg.h"

using namespace std;

int main () {
    string host     = "localhost";
    string username = "username";
    string database = "db";
    string password = "root";

    try {
        Pg<pqxx::connection> *db(host, username, database, password);
    } catch (pqxx::broken_connection) {
        cout << "Failed to establish connection." << endl;
    }

    return 0;
}
#包括
#包括
#包括
#包括“lib/db/pg/pg.h”
使用名称空间std;
int main(){
string host=“localhost”;
字符串username=“username”;
字符串database=“db”;
字符串password=“root”;
试一试{
Pg*db(主机、用户名、数据库、密码);
}捕捉器(pqxx::断开的连接){
cout在
main()
中,您的
db
变量被声明为指针。您不能像现在这样将构造函数参数传递给指针

您需要:

  • 从声明中删除
    *

    Pg<pqxx::connection> db(host, username, database, password);
    

  • 这是我的第一个版本,如果没有指定指针符号,我会遇到另一个错误:错误:调用“Pg::Pg(std::string&,std::string&,std::string&,std::string&,std::string&)时没有匹配的函数'您应该制作一个最小的可复制示例。删除try catch块,并检查错误是否仍然存在。删除Db.cpp和Pg.cpp,并检查错误是否仍然存在。尝试Pg而不是Pg。删除Db.h的参数和成员函数。尽可能删除所有内容,只要语法错误是可复制的,然后制作一个更大的文件而不是几个较小的文件,然后发送您的代码在这里。