В моем коде на C++ у меня есть объект класса, снабженный полем id типа int. Теперь я хочу создать вектор указателей типа Object *. Сначала я попробовалСоздание вектора указателей C++
vector<Object*> v;
for(int id=0; id<n; id++) {
Object ob = Object(id);
v.push_back(&ob);
}
но это не получилось, потому что здесь тот же адрес просто повторяется n раз. Если бы я использовал новый оператор, я бы получил то, что хочу, но я бы хотел избежать динамического распределения памяти. Затем я подумал, что мне нужно как-то объявить n разных указателей перед циклом for. Непосредственный способ это объявить массив, так что я сделал это:
vector<Object*> v;
Object ar[n];
for(int i=0; i<n; i++) {
ar[i] = Object(i);
}
for(int i=0; i<n; i++) {
v.push_back(ar+i);
}
Есть еще возможность получить утечку памяти, если я сделать это таким образом? Также, по моему мнению, рассмотрение объявления массива немного неуклюжие. Существуют ли другие способы создания вектора указателей, но избегайте ручного управления памятью?
EDIT: Почему я хочу указатели вместо простых объектов?
Ну, я немного изменил исходную ситуацию, потому что я так думал, что могу представить вопрос в простейшей возможной форме. В любом случае, я все еще думаю, что на вопрос можно ответить, не зная, почему я хочу вектор указателей.
На самом деле у меня есть
Class A {
protected:
vector<Superobject*> vec;
...
};
Class B: public A {...};
Class Superobject {
protected:
int id;
...
}
Class Object: public Superobject {...}
В производном классе B
Я хочу, чтобы заполнить поле члена vec
с объектами типа Object
. Если бы суперкласс не использовал указатели, у меня были бы проблемы с обрезкой объектов. Поэтому в классе B
конструктор я хочу инициализировать vec
как вектор указателей типа Object*
.
EDIT2
Да, мне кажется, что динамическое распределение является разумным вариантом, и идея использовать массив является плохой идеей. Когда массив выходит из области видимости, все пойдет не так, потому что указатели в векторе указывают на ячейки памяти, которые не обязательно содержат объекты больше.
В конструктор класса B Я был
B(int n) {
vector<Object*> vec;
Object ar[n];
for(int id=0; id<n; id++) {
ar[id] = Object(id);
}
for(int id=0; id<n; id++) {
v.push_back(ar+id);
}
}
Это вызвало очень странное поведение в объектах класса В.
Если вы не хотите динамического распределения памяти, то почему вы используете указатели? Вы можете также работать с массивом Object. –
Почему вы хотите сохранить указатели в первую очередь? – Yuushi
Проблема с вашим вторым методом заключается в том, что это не легальный C++. 'Object ar [n];' не является законным, если n не является константой. Кроме того, поскольку согласно вашему правлению у вас есть иерархия классов, но с 'Object ar [n];' у вас есть только объекты, а не суперобъекты. Кстати, ваш первый метод также неверен по той причине, что вы храните адреса объектов, которые были уничтожены. Я бы просто использовал динамическое распределение памяти. – john