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

Đề tài: Tính kích thước 1 thư mục cho trước (dùng Design pattern Composite)

  1. #1
    Ngày gia nhập
    05 2011
    Bài viết
    16

    Mặc định Tính kích thước 1 thư mục cho trước (dùng Design pattern Composite)

    Mình xây dựng 3 Lớp Manager, File, Folder như sau:
    C++ Code:
    1. #include <iostream>
    2. #include <vector>
    3. #include <string>
    4. using namespace std;
    5.  
    6. class Manager{
    7. public:
    8.     string name;
    9.     int type; // = 0 la thu muc, = 1 la tap tin
    10. public:
    11.     virtual void Xuat() = 0;
    12.     virtual int SizeManager() = 0;
    13. };
    14.  
    15. class File: public Manager{
    16. protected:
    17.     int size;
    18. public:
    19.     File(string name, int size)
    20.     {
    21.         this->name = name;
    22.         this->size = size;
    23.         this->type = 1;
    24.     }
    25.  
    26.     virtual void Xuat()
    27.     {
    28.         cout << name << "\t" << size << endl;
    29.     }
    30.  
    31.     virtual int SizeManager()
    32.     {
    33.         return this->size;
    34.     }
    35.  
    36.     virtual int CountManager()
    37.     {
    38.         return 1;
    39.     }
    40. };
    41.  
    42. class Folder: public Manager{
    43. protected:
    44.     vector <Manager*> manager;
    45. public:
    46.     Folder(string name)
    47.     {
    48.         this->name = name;
    49.         this->type = 0;
    50.     }
    51.  
    52.     virtual void Xuat()
    53.     {
    54.         cout << this->name << "\n";
    55.         for(int i=0; i<manager.size(); i++)
    56.             this->manager[i]->Xuat();
    57.     }
    58.  
    59.     void Addnew(Manager *newmn)
    60.     {
    61.         //
    62.     }
    63.  
    64.     virtual int SizeManager()
    65.     {
    66.         int sum = 0;
    67.         int i = 0;
    68.         for( ; i < manager.size(); i++)
    69.             sum += manager[i]->SizeManager();
    70.            
    71.         return sum;
    72.     }
    73.  
    74. };

    Khi gọi hàm thì tất kích thước của cả cây thư mục sẽ được in ra (đã test đúng)
    cout << d.SizeManager() << endl;
    giờ mình muốn cải tiến hàm SizeManager() thành -> SizeManager(string folderName) trong class Folder nhằm truyền vào thư mục bất kì (không phải thư mục gốc) rồi trả về kích thước của thư mục đó nhưng không biết phải duyệt thế nào, mong mọi người giúp đỡ!

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Theo mình nên tạo 1 biến static của class folder là 1 map giữa tên thư mục và 1 đối tượng (hoặc con trỏ) Folder.
    Hàm SizeManager(string folderName) sẽ là hàm static của class folder

    C++ Code:
    1. class Folder {
    2.     static std::tr1::unordered_map<string, Folder*> folders;
    3.  
    4. public:
    5.     Folder(string name)
    6.     {
    7.         this->name = name;
    8.         this->type = 0;
    9.         folders[name] = this;
    10.     }
    11.  
    12.     static int SizeManager(string folderName);
    13. ...
    14. };
    15. int Folder::SizeManager(string folderName) {
    16.     std::tr1::unordered_map<string, Folders*>::iterator mi = folders.find(folderName);
    17.     if( mi != folders.end())
    18.         return ((*mi).second)->SizeManager();
    19.     else {
    20.         cerr<<"Thu muc khong ton tai\n";
    21.         return 0;
    22.     }
    23. }
    Đã được chỉnh sửa lần cuối bởi boss14420 : 19-11-2011 lúc 02:28 AM.

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

    mình đoán rằng, nếu nhập name là một folder dạng "folder1/folder2" thì trong hàm main() thì bạn sẽ phải nhập cho folder1 và folder folder1/folder2 (phải tách 2 chuỗi là folder1 và folder1/folder2) thông qua addnew() như vậy trong main() sẽ có một vector <Manager*> manager; nữa được sinh ra, như vậy hàm SizeManager(void) sẽ trở thành SizeManager(vector<Manager*>), đó là với 1 folder con, nếu nhiều hơn thì có vẻ lại phải thay đổi prototype SizeManager() thì ko hay lắm. Mình đề xuất name ở đây là một đường dẫn, tách ra từng đường dẫn con như ví dụ trên sau đó trong hàm addnew() ta sẽ add cho tất cả các folder này bằng việc tạo như vậy khai báo một mảng vector<Manager*> để lưu(với đk là ta phải tách và tính ra đựoc số folder có thể có), addnew() có khai báo mẫu addnew(), name ta lấy mặc định của class Manager, như vậy thì trong class Folder ta sẽ khai báo một con trỏ kiểu vector<Manager*> như: vector<Manager*>* manager; addnew() sẽ cấp phát cho manager này, tuơng tự trong SizeManager() sẽ cũng phân giải tên giống addnew() và tính tổng số file trong đó, có một vấn đề là ta phải tạo ra một mảng để lưu chỉ số của mỗi folder con, lưu số file trong đó để hàm SizeManager() có thể sử dụng nó để chạy vòng for, do đó thêm một mảng int* arr; để lưu chỉ số và được cấp phát trong addnew() và SizeManager() sẽ sử dụng nó để tính số file.



    giống như này:

    C++ Code:
    1. #include <iostream>
    2. #include <vector>
    3. #include <string>
    4. using namespace std;
    5.  
    6. class Manager{
    7. public:
    8.     string name;
    9.     int type; // = 0 la thu muc, = 1 la tap tin
    10. public:
    11.     virtual void Xuat() = 0;
    12.     virtual int SizeManager() = 0;
    13. };
    14.  
    15. class File: public Manager{
    16. protected:
    17.     int size;
    18. public:
    19.     File(string name, int size)
    20.     {
    21.         this->name = name;
    22.         this->size = size;
    23.         this->type = 1;
    24.     }
    25.  
    26.     virtual void Xuat()
    27.     {
    28.         cout << name << "\t" << size << endl;
    29.     }
    30.  
    31.     virtual int SizeManager()
    32.     {
    33.         return this->size;
    34.     }
    35.  
    36.     virtual int CountManager()
    37.     {
    38.         return 1;
    39.     }
    40. };
    41.  
    42. class Folder: public Manager{
    43. protected:
    44.     vector <Manager*>* manager; // mảng folder con
    45.     int* arr; // mảng chỉ số
    46.     unsigned int n; // số folder con
    47. public:
    48.     Folder(string name)
    49.     {
    50.         this->name = name;
    51.         this->type = 0;
    52.     }
    53.  
    54.     virtual void Xuat()
    55.     {
    56.         cout << this->name << "\n";
    57.         for(int i=0; i<manager.size(); i++)
    58.             this->manager[i]->Xuat();
    59.     }
    60.  
    61.     void Addnew(Manager *newmn)
    62.     {
    63.         //phân giải name ra thành các folder con, tính số folder con(n)
    64.         //cấp phất cho manager: manager = new vector<Manager*>[n];
    65.         //cấp phát mảng chỉ số: ar = new int[n];
    66.     }
    67.  
    68.     virtual int SizeManager()
    69.     {
    70.         //
    71.         int sum = 0;
    72.         int i = 0;
    73.         for( ; i < manager.size(); i++)
    74.             sum += manager[i]->SizeManager();
    75.            
    76.         return sum;
    77.     }
    78.  
    79. };
    Đã được chỉnh sửa lần cuối bởi angelfalls : 19-11-2011 lúc 02:11 AM.

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

  1. Chương 8: Mẫu Iterator và Composite - Series bài dịch Design Pattern for Dummies
    Gửi bởi ali33C trong diễn đàn Tutorials và Thủ thuật lập trình Java
    Trả lời: 6
    Bài viết cuối: 02-05-2017, 10:14 PM
  2. Video hướng dẫn xây dựng trang web bán điện thoại di động dùng ASP.NET MVC 4 và Dependency Injection Design Pattern
    Gửi bởi Sounj trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 13
    Bài viết cuối: 12-05-2015, 02:09 PM
  3. 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
  4. DesignPattern | Composite pattern trong lập trình C#
    Gửi bởi nhc1987 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 11
    Bài viết cuối: 04-05-2011, 07:15 AM
  5. Design Pattern là gì?
    Gửi bởi evaritgalois trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 17-06-2009, 05:15 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