01/10/2018, 13:48

"static Singleton* m_instance;" là gì?

#include <iostream>
using namespace std;
 
class Singleton
{
private:
	static Singleton* m_instance;
	Singleton();
public:
	static Singleton* getInstance();
	void			method();
};

mình không biết " Singleton* " ý nghĩa là gì và hoạt động ntn bạn nhỉ. con trỏ lớp hay là gì vậy mọi người, lạ quá k giống mấy kiểu con trỏ mình học

rogp10 viết 16:01 ngày 01/10/2018
en.wikipedia.org

Singleton pattern

In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects. The term comes from the mathematical concept of a singleton. There are some who are critical of the s...

ibm.com

Use your singletons wisely

Are singletons overused? Veteran programmer J. B. Rainsberger suggests they might be, explains why, and offers tips for knowing when to use singletons and when to seek more flexible alternatives.

明玉 viết 15:59 ngày 01/10/2018

Class nó như một cái khuôn mẫu.
Instance của class là sản phẩm dựa trên khuôn mẫu.
Instance của class cũng nằm trên ram, cho nên cũng có khái niệm pointer trỏ đến nó như các kiểu dữ liệu khác. Class chính là một kiểu dữ liệu.

toan viết 15:53 ngày 01/10/2018

m_instance

thank bạn
vậy “m_instance” là một con trỏ kiểu Singleton bạn nhỉ. nó có thể trỏ bất kỳ trong lớp Singleton phải k bạn
sao mình ở dưới k thấy cấp phát bạn nhỉ

明玉 viết 15:50 ngày 01/10/2018

Class Singleton của bạn mới chỉ có phần declaration, chưa có implementation.
Vì class Singleton của bạn có static member (m_instance, getInstance()), nên thực tế ngay từ đầu bạn sẽ có ngay 1 static instance Singleton, instance này chỉ có 2 static member trên.
2 link trên nói khá kĩ đó bạn.

toan viết 15:53 ngày 01/10/2018

:((( tại mình k thạo tiếng anh nên khó hiểu bạn ah
m_instance là biến con trỏ bạn nhỉ

rogp10 viết 15:50 ngày 01/10/2018

Bạn đang học pattern?

static này có nghĩa là không cần đối tượng vẫn gọi được, nên không cần khởi tạo (Singleton class không cho phép khởi tạo, chỉ có đúng một thể hiện tồn tại, đây là mục đích duy nhất của singleton). Muốn sử dụng thì phải Singleton::getInstance() đã.

Viết đúng thì phải là:
static Singleton* m_instance = nullptr;
sau đó khi tạo nhớ check null.

明玉 viết 15:56 ngày 01/10/2018

Singleton nó đơn giản lắm, chả cần viết method trong class thì cũng làm được.

#include <iostream>
struct O { int a = 0; };
O *o = NULL;
O* getOObject() {
   if (o == NULL) o = new O;
   return o;
}
int main() {
   O* obj = getOObject();
   O* obj_1 = getOObject();
   std::cout << obj == obj_1 << std::endl;
}
toan viết 15:56 ngày 01/10/2018

thank ban nhieu
mình mới học thấy lạ quá, k như kiểu viết bình thường bạn nhỉ

rogp10 viết 16:00 ngày 01/10/2018

Mấy pattern này học xong subclass, đa hình thì đọc mới hiểu

toan viết 15:54 ngày 01/10/2018

thank bạn. mình có học qua
nhưng mình mãi không chỗ nào giải thích vì sao viết
static Singleton* m_instance;
và sau đó khi bên file định nghĩa thì viết đc như thế này

Singleton* Singleton::m_instance = NULL;

bạn có thể giải thích giúp mình sao lại viết "Singleton* " ở đầu dòng ntn nhỉ

Trần Hoàn viết 15:56 ngày 01/10/2018

Bạn nhớ cái này: “Mỗi class/struct là một kiểu dữ liệu”
Singleton* là con trỏ trỏ đến vùng nhớ kiểu Singleton

toan viết 16:02 ngày 01/10/2018

thank bạn
bạn ơi m_instance là phương thức, hay là biến bạn nhỉ. mà có dấu * thì là con trỏ rồi bạn nhỉ
nếu là phương thức thì phương thức cũng trỏ đc sao

thường cấu trúc của static là “static void phuongThuc();”
mình hiểu theo đây là: void = Singleton*
chẳng lẽ phuongThuc() = m_instance
bạn nhỉ. mình tưởng chỉ có biến mới là con trỏ đc, phương thức sao là con trỏ nhỉ

rogp10 viết 15:56 ngày 01/10/2018

bạn ơi m_instance là phương thức, hay là biến bạn nhỉ. mà có dấu * thì là con trỏ rồi bạn nhỉ

m_instance là biến, getInstance() mới là phương thức.

toan viết 15:58 ngày 01/10/2018

thank bạn. mình cũng nghĩ vậy
mình học lập trình cocos2dx thì có đoạn code bên .h như sau
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();

virtual bool init();

// a selector callback
void menuCloseCallback(cocos2d::Ref* pSender);

// implement the "static create()" method manually
CREATE_FUNC(HelloWorld);

};
ở đoạn này static tạo 1 biến createScene() hay là phương thức createScene() bạn nhỉ mà bên .cpp lại định nghĩa.
nhưng đoạn code bên .cpp
thì gần như vẫn là
Scene* HelloWorld::createScene()
{
// ‘scene’ is an autorelease object
auto scene = Scene::create();

// 'layer' is an autorelease object
auto layer = HelloWorld::create();

// add layer as a child to scene
scene->addChild(layer);

// return the scene
return scene;

}
bạn có thể giải thích giúp mình cách thức con trỏ ở trong static đối với createScene() không bạn

rogp10 viết 15:48 ngày 01/10/2018

Vấn đề mới này bạn nên đặt thớt khác và trình bày cho rõ ràng. Nhiều khả năng bạn nên tạm xếp cái framework đó một thời gian để củng cố lại kiến thức.

toan viết 16:03 ngày 01/10/2018

mình cũng đang học bằng cách hỏi luôn bạn ah
tìm tòi trên mạng bằng tiếng anh khó hiểu
dù sao cũng thank bạn

Bài liên quan
0