Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Gặp chút rắt rối với singleton pattern

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    50

    Arrow Gặp chút rắt rối với singleton pattern

    trong sách designpartten có viết bằng c#, bây giờ mình chuyển qua C++, nhưng có một số cái mình không biết mình chuyển đúng không(có một số cái trong C# hỗ trợ mà C++ không có) mà nó chạy không được.Bạn nào biết sửa dùm với
    Code:
    ////					MAU SINGLETON PATTERN
    #include<iostream.h>
    class DatabaseInfo
    {
    private:
    	char* ServerName;
    	char* DatabaseName;
    	char* UserName;
    	char* Password;
    protected:
    	static DatabaseInfo *m_Instance=NULL;//nó báo lỗi chổ này
    	DatabaseInfo()
    	{
    		ServerName=new char[20];
    		ServerName="HuyPhat";
    		DatabaseName=new char[20];
    		DatabaseName="PhatHuy";
    		UserName=new char[20];
    		UserName="ChanPhat";
    		Password=new char[20];
    		Password="PhatChan";
    	}
    public:
    	static DatabaseInfo* Singleton()
    	{
    		if(m_Instance==NULL)
    		{
    			m_Instance=new DatabaseInfo;
    		}
    		return m_Instance;
    	}
    };
    
    void main()
    {
    	DatabaseInfo *DB;
    	/*DB=new DatabaseInfo;*/
    	DB=DatabaseInfo::Singleton();//object duoc tao ra mot lan duy nhat
                 cout<<DatabaseInfo::Singleton().ServerName;
                 cout<<DatabaseInfo::Singleton().DatabaseName;
                 cout<<DatabaseInfo::Singleton().UserName;
                 cout<<DatabaseInfo::Singleton().Password;
    
    }

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    cậu này thích dùng con trỏ nhỉ
    static DatabaseInfo *m_Instance=NULL;//nó báo lỗi chổ này
    C++ không cho khởi tạo inline với property member như thế này

    toàn bộ là con trỏ
    char* ServerName;
    char* DatabaseName;
    char* UserName;
    char* Password;

    trong khi đó cấp phát fix size
    ServerName=new char[20];
    DatabaseName=new char[20];
    UserName=new char[20];
    Password=new char[20];


    đã cấp phát rồi lại gán hằng chuỗi
    ServerName="HuyPhat";
    DatabaseName="PhatHuy";
    UserName="ChanPhat";
    Password="PhatChan";

    viết class mà phương thức trả ra con trỏ
    static DatabaseInfo* Singleton()

    không thấy destructor

    lúc nào cũng là contro
    DatabaseInfo *DB;
    /*DB=new DatabaseInfo;*/

    Nói chung là cậu nên tránh những điều tui nói ở trên
    Đã được chỉnh sửa lần cuối bởi nguyentuan2 : 26-10-2007 lúc 11:01 PM.

  3. #3
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Bác chanphat khuân mấy cuốn C++ căn bản về ngâm cứu đã, làm gì mà vội thế. Em nghĩ chắc bác cũng mới học C++ thôi có phải không ? Thiên hạ cứ oang oang "đi tắt" với chả "đón đầu" nhưng mà thực ra không thể "biến không thành có, biến khó thành dễ" mà không cần đến những kiến thức căn bản.

    VD: Trong cái source của bác có đoạn

    Code:
    private:
        char * ServerName;
        ....

    Cái ServerName (DatabaseName...) ở trong private section thì làm sao mà lôi nó ra được để cout như ở trong hàm main được hở bác.

    Ngoài ra, những gì bác nguyentuan đã nói đều đúng, em chỉ bổ sung thêm là nếu bác không implement một cách tường minh thì C++ sẽ tự add vào các đồng chí sau: default constructor (không có param), copy constructor, operator=, destructor. Bởi vậy, nếu chỉ có một đồng chí default constructor được khai báo tường minh (không thuộc public section), thì không đảm bảo rằng chỉ có duy nhất một singleton được tạo ra trong suốt chương trình. Tức là, client có thể dùng copy constructor để tạo ra 2nd Singleton --> Error (Đấy là chưa kể trong môi trường multithread, nhiều thread có thể cùng gọi đến cái method chịu trách nhiệm khởi tạo - ở đây là static DatabaseInfo * Singleton, vì vậy, nếu không đảm bảo được rằng chỉ có đúng một thread là gọi thành công (các thread khác bị block) thì cũng dẫn đến có nhiều hơn một instance của Singleton được tạo ra).
    Đã được chỉnh sửa lần cuối bởi ilovecplusplus : 27-10-2007 lúc 02:20 AM.
    Our dreams are young and we both know they take us where we want to go...

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Đây là cái source của bác mà em mới fix lại (cũng không tốt lắm, single thread only):

    Code:
    #include <cstdlib>
    #include <string>
    #include <iostream>
    
    using std::string;
    
    class DatabaseInfo {
    public:
        static DatabaseInfo * getInstance () 
        {
            if (hInstance_ == NULL) {
                hInstance_ = createInstance ();
            }
            return hInstance_;
        }
        
        static void deleteInstance ()
        {    
            if (hInstance_) {
                hInstance_ -> ~DatabaseInfo ();
                delete hInstance_;
            }
            hInstance_ = NULL;
        }
        
    private:
        DatabaseInfo ()
        {
            databaseName_ = "example.db";
            serverName_ = "localhost";
            userName_ = "ilcpp";
            password_ = "secret";
        }
        
        DatabaseInfo (const DatabaseInfo & self)
        {
        }
        
        ~DatabaseInfo ()
        {
            if (!databaseName_.empty ())
                databaseName_.erase ();
            
            if (!serverName_.empty ())
                serverName_.erase ();
                
            if (!userName_.empty ())
                userName_.erase ();
                
            if (!password_.empty ())
                password_.erase ();
        }
        
    private:
        DatabaseInfo & operator= (const DatabaseInfo & self)
        {
            return *this;
        }
        
        static DatabaseInfo * createInstance ()
        {
            hInstance_ = new DatabaseInfo ();
        }
        
    private:
        static DatabaseInfo * hInstance_;
        string databaseName_;
        string serverName_;
        string userName_;
        string password_;    
    };
    
    DatabaseInfo * DatabaseInfo::hInstance_ = NULL;
    
    int main(int argc, char *argv[])
    {
        DatabaseInfo * uniqueDI = DatabaseInfo::getInstance ();
        /* 
              ** Do something with di and
              ** cleaning up before exit
              */
        DatabaseInfo::deleteInstance ();
        return EXIT_SUCCESS;
    }

    P.S: Bác hãy tìm thư viện Loki để ngâm cứu thêm.
    http://sourceforge.net/projects/loki-lib/
    Đã được chỉnh sửa lần cuối bởi ilovecplusplus : 28-10-2007 lúc 01:22 AM.
    Our dreams are young and we both know they take us where we want to go...

  5. #5
    Ngày gia nhập
    10 2007
    Bài viết
    50

    Mặc định thanks mấy bác nhé!!!!!

    Nhờ mấy bác mà em đã được mở rộng tầm mắt rồi!!!!!!!!!

  6. #6
    Ngày gia nhập
    11 2007
    Bài viết
    1

    Mặc định Gặp chút rắt rối với singleton pattern

    Trích dẫn Nguyên bản được gửi bởi ilovecplusplus Xem bài viết
    Đây là cái source của bác mà em mới fix lại (cũng không tốt lắm, single thread only):
    Ý của bạn về cái single thread là sao? Bạn có ý gì về sử dụng thread??

Các đề tài tương tự

  1. Chương V : Mẫu Singleton và Flyweight - Series bài dịch Design Pattern for Dummies
    Gửi bởi haihth trong diễn đàn Tutorials và Thủ thuật lập trình Java
    Trả lời: 4
    Bài viết cuối: 07-11-2013, 07:58 AM
  2. Khi nào thì dùng design pattern như Abstract Factory , Factory Method , Singleton , Buider ....???
    Gửi bởi ngocsonaat trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 01-10-2013, 03:39 PM
  3. Sử dụng Singleton(design pattern) cho đăng nhập trong MVC3 (Razor)
    Gửi bởi kevinquang91 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 5
    Bài viết cuối: 14-04-2013, 09:02 PM
  4. hướng dẫn bài tập với mẫu singleton
    Gửi bởi millionsun93 trong diễn đàn Nhập môn lập trình Java
    Trả lời: 1
    Bài viết cuối: 21-10-2012, 05:01 AM
  5. VIDEO] Giới thiệu về MVC 2 Framework của Microsoft và 3Tier and Pattern Singleton
    Gửi bởi shinichiqn trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 23-05-2010, 12:58 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn