Possible to make a singleton struct in C++? How?

左心房为你撑大大i 提交于 2019-12-24 15:12:07

问题


I like to experiment around as I learn more about coding. I have a program that would only require a single instance of a struct for the life of it's runtime and was wondering if it's possible to create a singleton struct. I see lot's of information on making a singleton class on the internet but nothing on making a singleton struct. Can this be done? If so, how?

Thanks in advance. Oh, and I work in C++ btw.


回答1:


Struct and class are in C++ almost the same (the only difference is default visibility of members).

Note, that if you want to make a singleton, you have to prevent struct/class users from instantiating, so hiding ctor and copy-ctor is inevitable.

struct Singleton
{
private:
    static Singleton * instance;

    Singleton()
    {
    }

    Singleton(const Singleton & source)
    {
        // Disabling copy-ctor
    }

    Singleton(Singleton && source)
    {
        // Disabling move-ctor
    }

public:
    Singleton * GetInstance()
    {
        if (instance == nullptr)
            instance = new Singleton();

        return instance;
    }
}



回答2:


A class and a struct are pretty much the same thing, except for some minor details (such as default access level of their members). Thus, for example:

struct singleton
{
    static singleton& get_instance()
    {
        static singleton instance;
        return instance;
    }

    // The copy constructor is deleted, to prevent client code from creating new
    // instances of this class by copying the instance returned by get_instance()
    singleton(singleton const&) = delete;

    // The move constructor is deleted, to prevent client code from moving from
    // the object returned by get_instance(), which could result in other clients
    // retrieving a reference to an object with unspecified state.
    singleton(singleton&&) = delete;

private:

    // Default-constructor is private, to prevent client code from creating new
    // instances of this class. The only instance shall be retrieved through the
    // get_instance() function.
    singleton() { }

};

int main()
{
    singleton& s = singleton::get_instance();
}



回答3:


Conceptually, a struct and a class are the same in C++, so a making singleton struct is the same as making a singleton class.

The only difference between class and struct are the default access specifiers and base class inheritance: private for class and public for struct. For example,

class Foo : public Bar 
{ 
 public: 
  int a;
};

is the same as

struct Foo : Bar
{
 int a;
};

So, there is no fundamental difference when it comes to singletons. Just make sure to read about why singletons are considered bad.

Here's a simple implementation:

struct singleton
{
  static singleton& instance()
  {
    static singleton instance_;
    return instance_;
  }
  singleton(const singleton&)=delete;            // no copy
  singleton& operator=(const singleton&)=delete; // no assignment

 private:
  singleton() { .... } // constructor(s)
};



回答4:


First off, struct and class only refer to the default access of members. You can do everything with a struct that you can do with a class. Now if you were referring to POD structs, things get more complicated. You can't defined a custom constructor, so there's no way to enforce only a single object creation. However, there's nothing stopping you from simply only instantiating it once.




回答5:


class and struct is almost a synonyms in C++. For singleton use case they are complete synonyms.



来源:https://stackoverflow.com/questions/15187289/possible-to-make-a-singleton-struct-in-c-how

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!