#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;
}