"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

1 Like

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.

1 Like

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ỉ

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.

2 Likes

:((( 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ỉ

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.

1 Like

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;
}
2 Likes

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

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

1 Like

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ỉ

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

2 Likes

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ỉ

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

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

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.

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 :frowning:
dù sao cũng thank bạn

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