2010-10-24 140 views
6

我在訪問類中的靜態屬性時遇到問題。我收到以下錯誤:C++靜態屬性

shape.obj : error LNK2001: unresolved external symbol "public: static class TCollection<class Shape *> Shape::shapes"

類的定義是:

class Shape { 

public: 
    static Collection<Shape*> shapes; 

    static void get_all_instances(Collection<Shape*> &list); 
}; 

和靜態方法的實施:

void Shape::get_all_instances(Collection<Shape*> &list) { 
    list = Shape::shapes; 
} 

這似乎是shapes屬性未被初始化。

+0

感謝您的快速反饋。花了幾個小時來研究,並在StackOverflow上花了大約1分鐘。 – Louis 2010-10-24 07:56:30

+0

我想你會非常後悔既有一個靜態變量以及有一個公共變量。你真的需要嗎?爲什麼不只是傳遞一個const Collection &object無論你需要什麼形式的列表?這將鼓勵其他開發人員在需要列表時調用Shape :: get_all_instances(),而不是顯式傳遞它。這會導致各種問題,當你想測試或者你想要在形狀的子列表上進行操作時。 – 2010-10-24 08:04:43

+0

是的,因爲憤怒的調試,它現在是公開的。 – Louis 2010-10-24 08:14:21

回答

10

你是對的,因爲靜態變量只類中聲明,而不是定義。

必須也定義它們,只需將以下行添加到您的實現文件中。

Collection<Shape*> Shape::shapes; 

它應該做的伎倆。

7

是的。您需要添加

Collection<Shape*> Shape::shapes; 

其中一個.cpp文件中定義靜態成員。

3

聲明在課堂上。

的定義必須放在只有一個CPP文件:

Collection<Shape*> Shape::shapes; 
5

您已經聲明shapes但沒有定義它。

的定義添加到實現文件

Collection<Shape*> Shape::shapes; //definition 
4

對於代碼,是你需要提供的shapes的定義,像(在實現文件)

Collection<Shape*> Shape::shapes(whatever constructor args); 

但是相反,你可能要考慮它返回一個參照當地的一個成員函數靜態Collection<Shape*>

乾杯& hth。