这个c ++ typedef有什么问题?

时间:2009-11-09 02:43:24

标签: c++ inheritance vector typedef

这是我的一段代码,我有更多类,如MathStudent,ArtStudent等,它继承了Student类。当我试图编译时,它说“禁止没有类型的'vector'的声明,”这里有什么问题? 谢谢

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

    virtual unsigned int getId() = 0;

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

4 个答案:

答案 0 :(得分:10)

您不能使用尚未定义的类。但是,您可以使用指向该类的指针。

您现在的具体错误可能是忘了#include <vector>using namespace std;。但是一旦你解决了这个问题,你就需要我的第一个建议。

答案 1 :(得分:6)

typedef的一个问题是class Student是一个抽象类,因此不能默认构造,这对于可以组成矢量的类型是必需的。

另一个问题(假设您删除了class Student是抽象的这一事实)可能是该类未完全定义。实际上,您可以为具有不完整类的vector<>声明typedef,但在完全定义类之前,您将无法实际使用typedef - 除非声明指针或对该类型的引用。

在这两种情况下你可能需要考虑类的整体设计 - 你可能想要一个vector<Student*>,所以矢量可以容纳任何类型的学生(使用指针,因为它不能保持实际抽象学生对象)。正如其他人提到的那样使用智能指针(但 std::auto_ptr<>)将有助于管理向量所指向的对象的生命周期。

答案 2 :(得分:3)

向量按值存储项目,而不是按引用存储。如果您希望能够存储MathStudentArtStudent等,则应考虑使用(智能)指针的向量来代替Student

typedef vector<shared_ptr<Student> > friends;

(其中shared_ptrstd::tr1::shared_ptrboost::shared_ptr,具体取决于您的C ++系统是否支持TR1。)

答案 3 :(得分:0)

您需要包含vector的标头并考虑名称空间。

例如:

#include <vector>

using namespace std;

...rest of your code here...

应该编译得很好。