在c ++中,使用对象向量是一个好主意吗?如果没有,这个c ++代码出了什么问题?
#include <vector>
using namespace std;
class A {};
int main() {
vector<A*> v ( new A);
return 0;
}
来自g ++:
13:错误:转换无效
A*' to
unsigned int'
答案 0 :(得分:11)
constructor for std::vector采用初始长度,而不是元素。
这意味着你通常会这样做:
vector<A*> v(1); // Initialize to length 1
v.push_back( new A() ); // Add your element...
您收到编译错误,因为在您的系统上,size_type
被定义为unsigned int
。它试图使用那个构造函数,但是失败了,因为你传递了一个指向A的指针。
答案 1 :(得分:4)
在使用您不知道的内容之前,您需要阅读documentation。
以下是std::vector
类的不同构造函数:
explicit vector ( const Allocator& = Allocator() );
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
template <class InputIterator>
vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
vector ( const vector<T,Allocator>& x );
答案 2 :(得分:2)
Vector没有一个构建器可以存储一个项目。
使用给定值制作一个项目的向量:
vector<A*> v ( 1, new A);
关于动态分配对象的指针向量是否是个好主意 - 没有。您必须手动管理该内存。
按值存储对象要好得多,或者必须 - 使用智能指针自动管理内存(例如std :: tr1 :: shared_ptr)。
答案 3 :(得分:1)
我建议不要像这样使用std::vector
:内存管理成为一场噩梦。 (例如,vector<A*> v ( 10, new A);
有十个指针,但只有一个已分配的对象,你必须记住只释放一次。如果你根本没有解除分配,你就有了不同意的记忆。)
相反,请考虑使用Boost Pointer Container library:您可以传入新分配的对象,它将为您处理所有内存管理。