我是OOP和C ++的新手。
我有一个名为Database的类。此类的构造函数将建立与数据库的连接。然后,我有其他类,如用户,分数等。我希望所有这些类共享来自Database类的连接。我该怎么做?
程序流程示例:
主要功能称为数据库类,它建立与数据库的连接。
我想对用户进行身份验证,如下所示:
用户a(“user1”,“password1”); a.authenticate(“user1”,“password1”);
但在我的Users :: authenticate函数中,如何使用已经建立的连接?
编辑:
我在c ++中使用mysql ++
在阅读答案后,我将使用“传递作为参考”方法。但我遇到了几个错误:
main.cpp
mysqlpp::Connection conn(false);
int main() {
if (conn.connect(DATANAME, HOST, DBUSER, DBPASS)) {
Users a(conn, "test","pass");
a.authenticate();
这是我的用户构造函数和身份验证功能:
Users.cpp
Users::Users(mysqlpp::Connection conn, string username, string password) {
this->conn = conn;
this->username = username;
this->password = password;
}
void Users::authenticate() {
if(this->conn != NULL){
cout << "Have connection" << endl;
} else {
cout << "No connection" << endl;
}
}
它可以编译和运行。但它命令行,它显示:
Segmentation fault.
任何想法为什么?我猜我的代码错了
答案 0 :(得分:5)
我建议将连接传递给其他类的构造函数。例如:
Connection conn("servername");
User u(conn, "user", "pass");
这是其他人建议的静态连接的替代方案。两者都工作正常但这种模式并不假设您正在运行的应用程序中只有一个数据库连接。
答案 1 :(得分:1)
您可以将Database
个对象设为单身人士 - 请参阅singleton design pattern。
我想到的第二个解决方案就是在Database
,Users
等的构造函数中引用Scores
对象。
答案 2 :(得分:1)
您的Users和Scores类需要有关数据库连接的信息。有很多方法可以实现这一目标;这里有几个。
您可以让每个Users和Scores对象在其构造函数中接收指向打开的Database对象的指针。这样,他们可以存储连接以供日后使用,其成员函数可以引用连接。
您可以使数据库成为单例,然后让Users和Scores类使用其全局可见的连接进行读写。这似乎是次优设计,因为它会强制程序中的所有对象使用相同的连接。
您可以使用Database对象导出工厂函数来使用它的连接创建Users和Scores对象。这本质上是第一个想法的变体,它使类之间的关系更加清晰,并且可以简化与其他对象共享私有连接状态变量的逻辑。
您可以修改用户和分数的成员函数,以便它们明确地将数据库作为参数,允许您根据需要更改数据源。
简而言之,您有很多选择。选择您认为最适合您特定应用的产品。
答案 3 :(得分:1)
如果不讨论您描述的设计是否良好,您想要实现的目标是:
class Database
{
public:
DbConnection& Connection();
private:
...
};
class User
{
public:
User(DbConnection& connection) : connection_(connection) { }
...
void Authenticate()
{
...
connection_.Authenticate(username_, password_);
...
}
private:
std::wstring username_;
std::wstring password_;
DbConnection& connection_;
}
答案 4 :(得分:0)
您可以使用静态变量。 http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx
因此,您可以从不同的类访问相同的值。
答案 5 :(得分:0)
可能你应该使用Singleton模式。您可以在Gang of Four的“设计模式”一书中阅读它。
答案 6 :(得分:0)
将Connection声明为static;如果您的Database类具有Connection对象,则:
static Connection connect;
您可以通过Database::Connection
访问它。
答案 7 :(得分:0)
执行此操作的一种方法是使数据库类成为单例。 但是,TDD实践表明您应该将数据库类传递给任何需要使用它的类。
请参阅此处查看Singleton示例http://www.codeproject.com/KB/cpp/singletonrvs.aspx