2011-02-13 107 views
0

我是OOP和C++的新手。C++ ::與所有其他類共享類

我有一個名爲數據庫的類。這個類的構造函數將建立與數據庫的連接。然後,我有其他類,如用戶,分數等我希望所有這些類共享從數據庫類的連接。我怎麼做?

程序流程的示例:

  • 主要功能調用數據庫類,它建立與數據庫的連接。

  • 我想驗證用戶,這樣的:

    一個用戶( 「用戶1」, 「密碼1」); a.authenticate(「user1」,「password1」);

但在我的Users :: authenticate函數中,如何利用已建立的連接?

編輯:

我用mysql ++在C++中

閱讀的答案後,我會用 「傳爲基準」 的方法。但我遇到severals錯誤:

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

即使單例模式將*工作*,我不明白爲什麼大家都在暗示它。本着給予一點指導的精神,除非你發現其他模式導致了單例的不同問題,否則我不會推薦單例。打開多個數據庫連接並不是一個問題(至少,爲什麼我們會假設它是?),所以單例對一個簡單的全局變量static應該沒有什麼優勢。 – tenfour 2011-02-13 12:28:34

回答

5

我建議將連接傳遞給其他類的構造函數。例如:

Connection conn("servername"); 
User u(conn, "user", "pass"); 

這是其他人建議的靜態連接的替代方法。兩者都可以正常工作,但是這種模式並沒有假設您的應用程序中只有一個數據庫連接。

+0

呃,所以COnnection連接(「服務器名稱」)是我連接到數據庫的線? – 2011-02-13 12:22:21

+0

是的。在概念上,一個`用戶`需要構建一些輸入 - 用戶名和密碼以及數據庫連接。通過這三個項目,您可以構建一個`User`對象;這就是爲什麼3個參數給構造函數。 – tenfour 2011-02-13 12:24:06

+0

我明白了。我最後一個問題。我應該在哪裏斷開連接?在主要功能的結尾? – 2011-02-13 12:27:49

0

可能你應該使用Singleton模式。你可以在四人幫的「設計模式」一書中閱讀它。

+0

如果您想要多個連接,該怎麼辦? – 2011-02-13 12:19:09

+0

例如,您可以創建一個調度程序單例對象,用於存儲所有連接並返回相應的連接。 – Kos 2011-02-13 12:22:18

0

聲明連接爲靜態;如果您的數據庫類具有Connection對象,則:

static Connection connect; 

您可以通過Database::Connection訪問它。

1

您可以將Database對象設爲單例 - 請參閱singleton design pattern

這使我想到的第二個解決方案只是給refernece到Database對象構造UsersScores

1

不知怎的,你的用戶和得分類會需要與數據庫連接信息。有很多方法來完成這一點;這裏有一些。

  1. 您可以讓每個用戶和得分對象在其構造函數中接受一個指向開放數據庫對象的指針。這樣,他們可以將連接存儲起來,以便他們的成員函數可以引用連接。

  2. 您可以將數據庫設置爲單例,然後讓Users和Scores類使用其全局可見連接來讀取和寫入。這似乎是一個不太理想的設計,因爲它會強制程序中的所有對象使用相同的連接。

  3. 您可以讓數據庫對象導出工廠函數,以使用它的連接創建用戶和得分對象。這實質上是第一個想法的變體,它使得類之間的關係更加清晰,並可能簡化與其他對象共享私有連接狀態變量的邏輯。

  4. 您可以修改用戶和成績的成員函數,以便他們將數據庫顯式作爲參數,允許您根據需要更改數據源。

總之,你有很多選擇。選擇你認爲最適合你的特定應用。

1

不討論你所描述的設計是否是好還是不好,你whant達到什麼是這樣的:

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_; 
}