2009-11-09 154 views
0

這是我的一段代碼,我有更多像MathStudent,ArtStudent等繼承Student類的類。當我試圖編譯時,它說「禁止聲明'vector'沒有類型,」這裏有什麼問題? 謝謝這個C++ typedef有什麼問題?

class Student { 
public: 
    typedef vector<Student> Friends; // something wrong here? 

    virtual unsigned int getId() = 0; 

    //some more pure virtual functions... 
}; 
+0

你能發表一個代碼產生你的錯誤和錯誤發生的確切線的實際代碼片段嗎?除了'std'命名空間的問題之外,您發佈的內容沒有問題,但嘗試實際使用'Student :: Friends'類型時會遇到問題。所以我想看看*你究竟在問什麼。 – 2009-11-09 03:14:53

回答

6

typedef的一個問題是class Student是一個抽象類,所以它不能被默認構造,這對於可以組成向量的類型是必需的。

另一個問題(例如,您刪除了class Student是抽象的事實)可能是該類未完全定義。事實上,你可以爲一個vector<>聲明typedef類型不完整,但是你不能實際使用typedef直到類被完全定義 - 除了聲明類型的指針或引用。

在這兩種一個情況下,你可能需要考慮一下類的整體設計 - 你可能希望有一個vector<Student*>代替矢量可以容納任何類型的學生(使用指針,因爲它不能持有一個實際的抽象Student對象)。正如其他人所提到的使用智能指針(但是而不是std::auto_ptr<>)將有助於管理矢量指向的對象的生命週期。

10

您不能使用尚未定義的類。但是,您可以使用指向該類的指針。

您現在的具體錯誤可能是您忘記了#include <vector>或做了using namespace std;。但只要你解決了這個問題,你需要我的第一個建議。

+6

哇。你應該**不要**在頭文件中放入一個using指令。 – rlbond 2009-11-09 03:14:49

+0

好點。但沒有人說這是在一個頭文件中。如果是這樣,那麼你是對的:不應該在全局範圍使用「using」,而應該使用'std :: vector'。 – 2009-11-09 03:31:52

+0

爲什麼我不能在頭文件中使用命名空間標準? – derrdji 2009-11-09 03:36:55

3

向量按值存儲項目,而不是通過引用。如果你想成爲能夠存儲MathStudentArtStudent,等等,你應該考慮使用的(智能)指針載體來Student代替:

typedef vector<shared_ptr<Student> > friends; 

(其中shared_ptr或者是std::tr1::shared_ptrboost::shared_ptr,取決於無論您的C++系統是否支持TR1)。

0

您需要包含矢量頭並考慮名稱空間。

如:

#include <vector> 

using namespace std; 

...rest of your code here... 

應該編譯就好了。