Я учусь использовать шаблон проектирования Singleton. Я написал простой код, включающий перегрузку конструктора и функцию завершения для удаления указателя. Проблема в том, что перегрузка конструктора не работает, она не принимает 2 параметра. Я не могу понять, почему?
//header============================================
#include <iostream>
using namespace std;
class singleton
{
public:
static singleton* getInstance();
static singleton* getInstance(int wIn,int lIn);
static void terminate();// memmory management
int getArea();// just to test the outputprivate:
static bool flag;
singleton(int wIn, int lIn);
singleton();
static singleton* single;
int width,len;
};
//implement=============================
#include "singleton.h"#include <iostream>
using namespace std;
int singleton::getArea(){
return width*len;
}
singleton* singleton::getInstance(int wIn,int lIn){
if (!flag)
{
single= new singleton(wIn,lIn);
flag= true;
return single;
}
else
return single;
}
singleton* singleton::getInstance(){
if (!flag)
{
single= new singleton;
flag=true;
return single;
}
else
{
return single;
}
}
void singleton::terminate(){
delete single;
single= NULL;
perror("Recover allocated mem ");
}singleton::singleton(int wIn,int lIn){
width= wIn;
len= lIn;
}
singleton::singleton(){
width= 8;
len= 8;
}
//main=======================================
#include <iostream>
#include "singleton.h"
bool singleton::flag= false;
singleton* singleton::single= NULL;
int main(){
singleton* a= singleton::getInstance();
singleton* b= singleton::getInstance(9,12);
cout << a->getArea()<<endl;
//a->terminate();
cout << b->getArea()<<endl;
a->terminate();
b->terminate();
return 0;
}
в вашей основной функции вы делаете
singleton* a= singleton::getInstance();
таким образом, экземпляр устанавливается в значение, которое синглтон получил из пустого конструктора. тогда вы делаете
singleton* b= singleton::getInstance(9,12);
но ты забыл это flag
true, потому что вы установили его в true в пустом конструкторе. так что эта строка бессмысленна.
после этого все, что вы делаете на b, остается таким же, как было, если вы делали это на a, поэтому оно не работает так, как вы хотели
main()
Функция чередует «строительство» и уничтожение синглтона.
Я не уверен, что вы ожидали, но если два указателя a
а также b
были разделены, вы получите другой результат.
Как это так a
а также b
указывают на тот же объект, и поэтому призывает getArea()
вернет тот же результат.