2010-03-09 2 views
0

В C++, используется вектор объектов хорошая идея? Если нет, что не так с этим кодом на C++?C++, вектор объектов

#include <vector> 

using namespace std; 

class A {}; 

int main() { 

     vector<A*> v (new A); 
     return 0; 
} 

от G ++:

13: error: invalid conversion from A*' to unsigned int'

ответ

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.

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

Вектор не имеет конструктор, который принимает один элемент для хранения.

Для того, чтобы вектор одного элемента с заданным значением:

vector<A*> v (1, new A); 

Что касается ли это хорошая идея, чтобы иметь вектор указателей динамически выделенные объекты - нет. Вы должны управлять этой памятью вручную.

Гораздо лучше хранить объекты по значению или использовать интеллектуальный указатель для автоматизации управления памятью (например, std :: tr1 :: shared_ptr).

1

Я бы рекомендовал не использовать std::vector следующим образом: управление памятью становится кошмаром. (Например, vector<A*> v (10, new A); имеет десять указателей, но только один выделенный объект, и вы должны помнить о освобождении только один раз. Если вы вообще не освобождаете от ответственности, у вас есть свободная память.)

Вместо этого рассмотрите возможность использования Boost Pointer Container library: вы можете передать вновь выделенные объекты, и он будет обрабатывать все управление памятью для вас.

Смежные вопросы