【问题标题】:Constructor overloading in Singleton doesn't work单例中的构造函数重载不起作用
【发布时间】:2013-08-28 01:55:45
【问题描述】:

我正在学习使用单例设计模式。我写了一个简单的代码,包括构造函数重载和一个终止函数来删除指针。问题是构造函数重载不起作用,它不需要 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 output


private:
        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;
}

【问题讨论】:

  • 公平警告,单例是一种反模式。
  • 单例的全部意义在于你只能创建一个对象。使用带有参数的构造函数的单例是没有意义的,因为这意味着您可以创建具有不同参数的多个对象。我想你不明白单例是干什么用的。也许你真正想要的是工厂模式?
  • 定义:“不起作用”
  • 使用 g++ 4.4.7 编译和运行良好,输出:64 64 Recover assigned mem : Success Recover assigned mem : Success RUN SUCCESSFUL (总时间: 64ms)
  • @john:一次也可以是一个选项(对于那些认为单例一开始就是一个选项的人)。无论如何,我都不会在 getInstance() 函数中使用参数,但这是一个不同的问题(就像实现不是线程安全的或不需要 bool 标志...

标签: c++ singleton destructor constructor-overloading


【解决方案1】:

在你的主要功能中你做

singleton* a= singleton::getInstance();

所以实例被设置为单例从空构造函数获得的值。那你就做

singleton* b= singleton::getInstance(9,12);

但是您忘记了 flag 是 true,因为您在空构造函数中将其设置为 true。所以这条线没有意义。

之后,你在 b 上所做的一切都与你在 a 上所做的一样,所以它不能按你的意愿工作

【讨论】:

  • 不知道:这是 OP 写的,所以我们期望它的行为应该是这样。
  • @computer 好名字,为什么编译错误?都是好代码,只是期望一件事,而得到另一件事......
  • @NoIdeaForName:我假设 OP 打算在两个构造函数中设置 flag,所以没有一行代码是没有意义的,但可能不会达到你的预期。
【解决方案2】:

main() 函数将单例的“构造”和销毁交错。

我不确定你的预期,但如果两个指针 ab 分开,你会得到不同的输出。

因为ab 都指向同一个对象,所以对getArea() 的调用将返回相同的结果。

【讨论】:

  • 我理解我的错误和你的意思,但实际上 b-&gt;getArea() 返回的值与 a-&gt;getArea() 不同,这很奇怪。这里是the console
  • @Tiana987642:这很奇怪。我编译了您的代码 (ideone.com/duY2kq),它按预期工作。
  • 是的,我不明白为什么我的很奇怪?你知道,如果 a-&gt;getArea() b-&gt;getArea() 返回相同的值,我可以更快地认出我的错误......
  • 啊,我在a-&gt;getArea() 之后立即致电terminate()。这就是原因。谢谢!
  • 是的,看起来您对getArea() 的第二次调用调用了singleton 的未初始化实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2015-09-27
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多