这是我的一段代码,我有更多类,如MathStudent,ArtStudent等,它继承了Student类。当我试图编译时,它说“禁止没有类型的'vector'的声明,”这里有什么问题? 谢谢
class Student {
public:
typedef vector<Student> Friends; // something wrong here?
virtual unsigned int getId() = 0;
//some more pure virtual functions...
};
答案 0 :(得分:10)
您不能使用尚未定义的类。但是,您可以使用指向该类的指针。
您现在的具体错误可能是忘了#include <vector>
或using namespace std;
。但是一旦你解决了这个问题,你就需要我的第一个建议。
答案 1 :(得分:6)
typedef的一个问题是class Student
是一个抽象类,因此不能默认构造,这对于可以组成矢量的类型是必需的。
另一个问题(假设您删除了class Student
是抽象的这一事实)可能是该类未完全定义。实际上,您可以为具有不完整类的vector<>
声明typedef,但在完全定义类之前,您将无法实际使用typedef - 除非声明指针或对该类型的引用。
在这两种情况下你可能需要考虑类的整体设计 - 你可能想要一个vector<Student*>
,所以矢量可以容纳任何类型的学生(使用指针,因为它不能保持实际抽象学生对象)。正如其他人提到的那样使用智能指针(但不 std::auto_ptr<>
)将有助于管理向量所指向的对象的生命周期。
答案 2 :(得分:3)
向量按值存储项目,而不是按引用存储。如果您希望能够存储MathStudent
,ArtStudent
等,则应考虑使用(智能)指针的向量来代替Student
:
typedef vector<shared_ptr<Student> > friends;
(其中shared_ptr
为std::tr1::shared_ptr
或boost::shared_ptr
,具体取决于您的C ++系统是否支持TR1。)
答案 3 :(得分:0)
您需要包含vector的标头并考虑名称空间。
例如:
#include <vector>
using namespace std;
...rest of your code here...
应该编译得很好。