2012-05-03 114 views
3
class A 
{ 
    private: 
     A() {} 

    public: 
     static A* getInstance() 
     { 
      return new A(); 
     } 
}; 

int main() 
{ 
    A.getInstance(); 
    return 0; 
} 

導致標題中聲明的錯誤。我意識到,如果我在A類中創建一個變量並立即將其返回並直接返回,那麼錯誤將會消失。錯誤:預計在'。'之前的非限定id令牌

但是,在這裏我想明白這個錯誤是什麼意思,爲什麼我不能這樣使用它。

回答

12

您需要使用範圍解析運算符來調用方法 - ::

A::getInstance(); 

此外,如果這意味着是一個單身,這是一個非常糟糕的一個。每當你打電話給getInstance(),你都會收到一個新的對象,如果你忘記刪除任何實例,你會遇到內存泄漏。 (在Java中沒有.例如像)

class A 
{ 
    private: 
     A() {} 
     static A* instance; 
    public: 
     static A* getInstance() 
     { 
      if (!instance) 
       instance = new A(); 
      return instance; 
     } 
}; 

//implementation file 
A* A::instance = NULL; 
+0

是的,是的,當然,這仍然是測試代碼:

我們也可以通過創建一個類的對象,並使用.操作者調用靜態函數。我仍然試圖瞭解這個單身人士。謝謝。 –

+1

您可以通過在'getInstance'中使用靜態局部變量而不是靜態類成員來簡化您的單例實現。 –

+0

我們在這裏沒有內存泄漏嗎?它將如何被破壞? –

4

使用範圍解析操作::

一個單通常被實現,像這樣

A::getInstance(); 
+0

@AnishaKaul:它在C++中被稱爲範圍解析運算符。 hmjd:你能編輯Java位嗎?這可能會讓新手感到困惑。 – dirkgently

+0

@dirkgently,完成。 – hmjd

+0

@hmjd現在你已經刪除了那些Java信息,你的答案與其他人沒有區別。我認爲這是一個語法錯誤,從一本書中複製了它 - 不知道它是Java的語法。你不應該刪除它。 –

1

您可以使用調用靜態成員函數.::。但是,如果您使用類名稱,則需要使用後者和對象,然後使用前者。

1

使用範圍解析操作符::

例如

class::methodName() 
2

getInstance是類A的靜態函數。調用類的靜態函數的正確形式是<class_name>::<static_function_name><class_object>.<static_function_name>

相關問題