错误:'boiler :: uniqueInstance == 0l'中的'operator =='不匹配

时间:2012-05-04 06:02:03

标签: c++ design-patterns

#include <iostream>
using namespace std;

class boiler
{
private:
    static boiler uniqueInstance;

    bool boilerEmpty;
    bool mixtureBoiled;

    boiler()
    {
        boilerEmpty = true;
        mixtureBoiled = false;
    }

public:
    static boiler getInstance()
    {
        if(uniqueInstance == NULL)
        {
            uniqueInstance = new boiler();
        }

        return uniqueInstance;
    }
};

以上代码返回标题中声明的错误。

anisha@linux-y3pi:~> g++ -Wall test.cpp
test.cpp: In static member function ‘static boiler boiler::getInstance()’:
test.cpp:22:26: error: no match for ‘operator==’ in ‘boiler::uniqueInstance == 0l’
test.cpp:24:34: error: no match for ‘operator=’ in ‘boiler::uniqueInstance = (operator new(2u), (<statement>, ((boiler*)<anonymous>)))’
test.cpp:5:1: note: candidate is: boiler& boiler::operator=(const boiler&)

为什么呢?我们不能将“对象”与NULL进行比较吗?是否存在一些语法问题?

2 个答案:

答案 0 :(得分:2)

你可能需要一个指针:

static boiler* uniqueInstance;

从那时起,您正在使用new初始化它:

uniqueInstance = new boiler ();

编译器告诉你它无法将boiler的实例与int(实际为long)进行比较。这种比较不存在。可以将指针与整数类型进行比较,从而可以将比较为0。

此处与NULL的比较可用作检查指针是否已初始化的方法。如何使用实例执行此操作并不明显,没有无效或未初始化实例的概念。您可以通过定义相应的NULL将对象与operator==进行比较,但这种比较可能没有意义,因为NULL通常只是0的另一个名称。

答案 1 :(得分:1)

您将uniqueInstsance声明为类实例:

 static boiler uniqueInstance;

但有时将其视为指针:

uniqueInstance = new boiler ();

我认为您应该将其声明为指针,以便您可以动态分配实例:

static boiler* uniqueInstance;

您还需要更改getInstance()以返回指针:

static boiler* getInstance() //...

最后确保在类声明之外的某处确实有uniqueInstance的定义。在.cpp文件中的一个位置(不是标题):

boiler* boiler::uniqueInstance;