Hỏi cách cài đặt Singleton cho bài tập C++

Mình có bài tập như này:

Render to Scene (4 pts)

Figure 1 A SceneManager class that manages all objects.

There are 2 requirements in this first task:

a) Create classes as following structure:

  •      Create a SceneManager class to manage all objects in the scene.
    

o Update (float frameTime)
o Render()
o AddObject(Object *object);
o Init() // Load Objects from a text file.

  •      Create Object class:
    

o position // current position of the object
o mass // the mass of the object
o velocity
o Render()
o Update(float frameTime)

  •      From object class: extends to Rectangle, Circle and Plane (to make the four walls)
    

Mọi người cho hỏi dùng Singleton design pattern C++ để biểu diễn các class, các thuộc tính vào phương thức như nào cho hợp lý ạ, mình cảm ơn

Hi Long Thành.
Singleton design pattern là cái gì vậy ?

Là Singleton Pattern đấy bác, em newbie bác đừng bắt bẻ em quá chứ :frowning:

Hi Long Thành.
tồn tại duy nhất song có thể truy xuất mọi lúc mọi nơi

:frowning: vâng cái này thì em biết rồi

Hi Long Thành.
???

Nhưng mà triển khai như nào ấy ạ

Hi Long Thành.
Banj xem lớp nào cần như vậy thì viết nó là Singleton là xong. Thường là mấy lớp quản lý hoặc lớp thông tin hệ thống hoặc cache.

Viết nó là S là sao ạ? em không hiểu lắm

Nhìn bài hình như là game engine thì phải.

Mình khuyên là hạn chế dùng singleton nhất có thể, trừ khi nó là thứ chạy xuyên suốt chương trình như Logger, còn lại thì đừng nên dùng
Nếu tạo singleton thì tạo sẵn 1 class abstract là singleton, sau đó kế thừa nó.

Bạn có thể google xem mẫu.

3 Likes

Hi Dark.Hades.
Cái vụ kế thừa lại phải đi ép kiểu có vẻ không đúng lắm thì phải.

Làm template là xong đâu cần phải ép kiểu đâu nhỉ
https://sites.google.com/site/sbskit/gamefornewbie/11-singleton-template-class

1 Like

Chào bạn @duy_nguyen_duc1,

Singleton là một design pattern hay được dùng khi bạn muốn hạn chế việc khởi tạo object từ một class. Ví dụ như bạn muốn hạn chế toàn ứng dụng chỉ có một object được ghi file, một object được ghi log hay chỉ có một database connection pool chẳng hạn.

Giả sử mình có chương trình tên là Foo và cần một FooManager để quản lý toàn cục các thứ mình có trong app. Mã giả mình sẽ viết như sau.

class FooManager {
  // khởi tạo một đối tượng instance là biến static của class.
  // chú ý là tùy mỗi ngôn ngữ sẽ có cách khởi tạo khác nhau.
  static FooManger instance = new FooManager();

  // hàm khởi tạo của class
  function FooManager() {
    this.logger = this.initLogger();
    this.connectionPool = this.initConnectionPool();
  }

  public function logInfo(String message) {
    this.logger.info(message);
  }

  public function getConnection() {
    this.connectionPool.getConnection();
  }
}

// Sử dụng
connection = FooManager.getConnection();
FooManager.logInfo("Got connection from pool");

Áp dụng vào bài tập của bạn, mình đoán lý do mà người ra đề muốn bạn dùng Singleton là vì cả ứng dụng của bạn chỉ có một ScreenManager.

Tất nhiên mình (và chắc không có ai ở đây) sẽ không làm bài tập cho bạn cả mà sẽ hướng dẫn cách giải.

Nếu mình hiểu đúng đề, mình sẽ gợi ý cho bạn là ScreenManager class sẽ có state là một array các objects, và có các behaviors như đã được gợi ý.

Khi sử dụng Singleton pattern bạn cũng nên tìm hiểu trên mạng đọc thêm về lợi/hại của nó nữa. Sau khi đọc thêm bạn có thể viết lại ở thread này để giúp các bạn đi sau cũng có thể đọc được.

Nếu theo đúng đề, chỉ C++ nhỏ, thì tạo 1 object Scene Manager trong hàm main() là đủ.

Singleton Design Pattern là chỉ tạo 1 đối tượng duy nhất, nhưng lại quên nhắc là 1 object trong context nào, theo đề của bạn là hàm main(), còn trong ví dụ thì đa số phần code hiện thực singleton mức application, hay 1 app chỉ có 1 object.

Dù bạn ứng dụng Singleton hay Design Pattern nào nên sử dụng linh hoạt và mềm dẻo. Design Pattern mọi người thấy khó học vì đa số chỉ chú tâm vào code, tìm case nào giống nhất mới áp dụng. Trong khi sách nguyên bản Design Pattern, tác giả nói là hãy vận dụng mềm dẻo, và code chỉ là 1 hiện thực cho solution chung của Design Pattern.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?