Quick actions

cmd+k|ctrl+k

Navigation

Languages

Singleton

Snippet info

Language

Cpp

Visibility

public

Author

e.berkheev

Created

2016-03-10T06:05:02Z

Updated

2016-03-10T06:17:38Z

#include <iostream>
#include <cassert>
using namespace std;

class data{
public:
    data(char* text){
        this->text = text;
    }

    char* getText(){
        return text;
    }
private:
    char* text;
};

template <typename T> class Singleton
{
    static T* reference;
    
public:
    Singleton(void){
        assert(!reference);
        long offset = (long)(T*)1 - (long)(Singleton<T>*)(T*)1;
        reference = (T*)((long)this + offset);
    }
    
    ~Singleton(void){
        assert(reference);
        reference = 0;
    }
    
    static T& Get(void){
        assert(reference);
        return *reference;
    }
    
    static T* GetPtr(void){
        assert(reference);
        return reference;
    }
};

template <typename T> T* Singleton<T>::reference = 0;

class Temp : public Singleton<data>{
public:
    Temp(char* name){
        dataPtr = new data(name);
    }
    ~Temp(){
        delete dataPtr;
    }
private:
    data* dataPtr;
};
    
void test(void){
    Temp value = Temp("a");
    
    data dataValue = Temp::Get();
    cout << *(dataValue.getText());
    
    //delete temp;
}

int main() {
    test();
    
    return 0;
}
INFO