2012-05-04 2 views
0
#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; 
    } 
}; 

Приведенный выше код возвращает ошибку, указанную в названии.ошибка: нет соответствия для 'operator ==' in 'boiler :: uniqueInstance == 0l'

[email protected]:~> 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? Существуют ли синтаксические проблемы?

+0

Если вы хотите использовать '==' с вашим собственным классом, вам понадобится 'operator ==' перегрузка. – chris

+2

Может помочь вам: http://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289#1008289 – Muggen

+0

Кроме того, это также полезно понять, почему C++ не является Java: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – Muggen

ответ

2

Вы, вероятно, нужно указатель:

static boiler* uniqueInstance; 

с тех пор вы его инициализации с new здесь:

uniqueInstance = new boiler(); 

Компилятор говорит вам, что он не может сравнить экземпляр boiler с междунар (на самом деле длинный). Это сравнение не существует. Указатели можно сравнить с интегральными типами, что позволяет сравнивать с 0.

Здесь сравнение с NULL служит в качестве средства проверки того, был ли ваш указатель уже инициализирован. Не очевидно, как это сделать с примерами, нет понятия недействительного или неинициализированного экземпляра. Вы можете сравнить объект с NULL, указав соответствующий operator==, но сравнение может не иметь смысла, поскольку NULL часто является просто другим именем для 0.

+0

очень благодарен вам. Это сделал трюк. Но почему компилятор жаловался на оператор ==? –

+0

@ АнишаКауль Я просто добавил объяснение. – juanchopanza

+0

Это отличное объяснение. Можете ли вы предложить, какие темы следует читать, чтобы понимать такие ошибки? –

1

Вы объявляете uniqueInstsance как экземпляр класса:

static boiler uniqueInstance; 

но иногда рассматривать его как указатель:

uniqueInstance = new boiler(); 

Я думаю, что вы должны объявить его как указатель, так что вы можете динамически выделять экземпляр :

static boiler* uniqueInstance; 

Вы также хотите изменить getInstance() t о возвращает указатель:

static boiler* getInstance() //... 

Наконец убедитесь, что вы на самом деле есть определение uniqueInstance где-то вне объявления класса. В одном месте в файле .cpp (не в заголовке):

boiler* boiler::uniqueInstance; 
+0

есть, все было. Благодарю. но компилятор жаловался на оператор ==, поэтому я не мог догадаться об этом. –

Смежные вопросы