Nhờ giúp chỉnh sửa singleton

Chào mọi người, em khá mới với design pattern, em có tạo singleton thế này, nhưng nó bị lỗi, nhờ mọi người giúp em với ạ, em xin cảm ơn.

#include "pch.h"
#include <iostream>
#include <cstdio>
#include <string>
#include <sstream>
#include <memory>

class singleton {
private:
	std::unique_ptr<singleton> uniqueInstance = NULL;
	singleton() { std::cout << "Instance success!"; }


public:
	std::unique_ptr<singleton> GetInstance()
	{
		if (uniqueInstance == NULL)
			uniqueInstance = std::make_unique<singleton>();
		return uniqueInstance;
	}
};

int main()
{

	return 0;
}

Lỗi???
Lỗi gì???

3 Likes


Nó bị lỗi này nè anh.

unique_ptr ko copy được. unique nghĩa là độc nhất vô nhị rồi làm sao có bản copy.

google “c++ singleton” là nó ra link stackoverflow chỉ cách implement liền mà

6 Likes

Em có thử tạo mấy cái giống trên mạng nữa mà chưa có hiểu lắm, em thấy cái psudo code của cái này dễ hiểu nên thử làm theo.
Em không copy nó nữa mà chỉnh thành thế này, xong rồi cũng ko biết cách dùng được.

std::unique_ptr<singleton>& GetInstance()
{
	if (uniqueInstance == NULL)
		uniqueInstance = std::make_unique<singleton>();
	return uniqueInstance;
}
1 Like

nếu đã trả về & rồi còn xài con trỏ làm gì nữa :V

ko biết cách dùng là sao :V :V

trong C++ có biến static trong hàm để làm gì :V

class S {
private:
    S() { ... } // private constructor để ko ai tạo S được 

public:
    static S& getInstance() { // hàm static để ko cần object nào của S vẫn gọi được. Trả về S& để tránh copy
        static S instance; // biến static trong hàm nghĩa là instance sẽ được khởi tạo 1 lần duy nhất mặc dù gọi S::getInstance() nhiều lần
                           // C++11 trở đi bảo đảm thread-safe luôn, nghĩa là nếu ban đầu 2 thread gọi S::getInstance() cùng lúc thì 1 thread sẽ chờ cho thread kia khởi tạo xong mới chạy tiếp được, khỏi cần synchronized gì ở đây hết
        return instance; // xong, khỏi ktra if else gì hết :V 
    }

    S(const& S) = delete; // delete nghĩa là ko có hàm này. Phải delete nó để tránh xài copy ctor tạo 1 object mới, vd S copy{S::getInstance()};
    void operator=(const S&) = delete; // delete toán tử gán luôn
};

// Java dỏm mỗi lần get instance lại phải tốn vài cycle check if, chậm hơn C++ masterrace nhoa :kissing_closed_eyes:

7 Likes

Thiệt là khó, :frowning: cảm ơn anh, anh vẫn nhiệt tình. :innocent:

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