Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Zoominger
364 / 253 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
#1

Как добавить объект в вектор? - C++

27.11.2012, 18:51. Просмотров 2121. Ответов 16
Метки нет (Все метки)

Здравствуйте. Есть вектор:
C++ (Qt)
1
2
3
int main(){
              short int Size=10;
              vector <Book> Library(Size);
То есть массив из 10 объектов. Когда я пытаюсь сразу записать новый элемент на 10-ое место (т. е. добавить новый) - вылетает ошибка сегментирования, пытался создавать новый объект и записывать его в конец через push_back - не помогло. Подскажите, в чём может быть проблема? Компилятор GCC.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 18:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как добавить объект в вектор? (C++):

Как добавить в вектор приватный объект класса - C++
Как добавить в вектор приватный объект класса? К примеру . ... class Class { public: int metod(); // который = b int i;

Как добавить объект в массив объектов? - C++
Начинающий, камнями прошу не кидаться :) Как создать динамический массив объектов я уже понял, а вот как добавить еще один элемент к...

ATL не ясно как добавить объект - C++
Здорова! Создал проект ATL dll. В книге написано: &quot;После создания COM сервера можно добавлять в него COM классы. Для вызова мастера...

Как редактировать поля структуры и как добавить новый элемент в вектор структур? - C++
Отзовитесь, пожалуйста, кто-то. Допустим есть структура struct worker { int exp; const char* name; const...

Как добавить в вектор содержимое вложенных каталогов - C++
Здравствуйте, подскажите пожалуйста как добавить в вектор содержимое внутренних каталогов, а не только тех которые содержатся в указанной...

Как добавить символ конца строки в вектор - C++
Здравствуйте, как я понимаю getline не записывает символ конца строки в массив, я попытался найти решение, но результата нет, может быть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.11.2012, 18:57 #2
Цитата Сообщение от Zoominger Посмотреть сообщение
пытался создавать новый объект и записывать его в конец через push_back - не помогло.
Код с ошибкой в студию.
1
Zoominger
364 / 253 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
27.11.2012, 19:01  [ТС] #3
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <vector>
//Добавить конструкторы/деструкторы
using namespace std;
 
class Book{
               public:
                        string Name, Author, Janre;
                        int Year;  
                        void AddBook(vector <Book> &Library, short int Size);//Проблемная функция
                        void DeleteBook(vector <Book> &Library, short int Size);
                        void Cout(vector <Book> &Library, short int Size);
                        void Find(vector <Book> &Library, short int Size);
                        void Initialized(vector <Book> &Library, short int Size);
          };
 
void Clear(vector <Book> &Library, short int Size);
 
int main(){
              short int Size=10;
              vector <Book> Library(Size);
              cout << Size;
              Library[0].Initialized(Library, Size);
              Library[0].Cout(Library, Size);
              Library[0].AddBook(Library, Size);
              Library[0].Cout(Library, Size);cout << Size;
              return 0;
}
 
void Book::Cout(vector <Book> &Library, short int Size){
                                                        for(int i=0; i<Size; i++)if(Library[i].Name != "\0")cout << "KHurA #" << i+1 << ": uM9l: " << Library[i].Name << "; rog: " << Library[i].Year << "; ABTOP: " << Library[i].Author << "; }|{AHP: " << Library[i].Janre << endl;
                                                  }
 
void Book::AddBook(vector <Book> &Library, short int Size){//Проблемная функция
                                                        Size++;
                                                        Book *New = new Book;
                                                        Library.push_back(New);
                                                        cout << "BBeguTe HA3BAHUE KHUru, rog u3gaHu9l, ABTOPA u }|{AHP: \n";
                                                        cin >> Library[Size].Name >> Library[Size].Year >> Library[Size].Author >> Library[Size].Janre;
                                                        cout << "onepaLLu9l 3aBepLLIEHA ycneLLIHO! \n";
                                                    }
 
void Book::DeleteBook(vector <Book> &Library, short int Size){
                                                                  cout << "BBEguTE HOMEP kHuru: \n";
                                                                  Cout(Library, Size);
                                                             }
 
void Book::Initialized(vector <Book> &Library, short int Size){
                                                            Library[0].Name = "segesg";
                                                            Library[1].Name = "seg525852esg";
                                                            Library[2].Name = "seg7257esg";
                                                            Library[3].Name = "se727gesg";
                                                            Library[4].Name = "sege427sg";
                                                        }
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.11.2012, 19:16 #4
Цитата Сообщение от Zoominger Посмотреть сообщение
cin >> Library[Size].Name >> Library[Size].Year >> Library[Size].Author >> Library[Size].Janre;
Нумерация с нуля идет.

Прочитайте книгу об ООП, вы его в корне не понимаете.

Добавлено через 48 секунд
Цитата Сообщение от Zoominger Посмотреть сообщение
Book *New = new Book;
Динамическое выделение не нужно.
1
Zoominger
364 / 253 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
27.11.2012, 19:19  [ТС] #5
Нумерация с нуля идет.
Я сначала увеличиваю переменную Size и пишу данные на новое место.


Цитата Сообщение от soon Посмотреть сообщение
Динамическое выделение не нужно.
А что нужно-то?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.11.2012, 19:22 #6
Цитата Сообщение от Zoominger Посмотреть сообщение
Я сначала увеличиваю переменную Size и пишу данные на новое место.
В векторе будет 11 элементов, но индекс последнего будет 10.

Цитата Сообщение от Zoominger Посмотреть сообщение
А что нужно-то?
Тут можно обойтись временной переменной.
C++
1
2
3
Library.push_back(Book());
// or
Library.emplace_back(Book());
Или сначала ввести в переменную данные, а потом добавить ее в вектор.

Но лучше переписать код с нуля.
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 19:26 #7
Цитата Сообщение от Zoominger Посмотреть сообщение
пытался создавать новый объект и записывать его в конец через push_back - не помогло.
Через push_back всё должно работать. Size не нужно использовать, вектор сам знает свой размер. Просто создаёте новый объект и добавляете (через push_back) в конец вектора. Вектор сам управляет своей памятью, поэтому никаких изменений Size здесь не нужно. Что-то такое:
C++
1
2
3
4
5
6
7
8
9
void Book::AddBook(vector <Book> &Library)
{
    Book book;
    
    cout << "BBeguTe HA3BAHUE KHUru, rog u3gaHu9l, ABTOPA u }|{AHP: \n";
    cin >> book.Name >> book.Year >> book.Author >> book.Janre;
    Book.push_back(book);
    cout << "onepaLLu9l 3aBepLLIEHA ycneLLIHO! \n";
}
1
Zoominger
364 / 253 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
27.11.2012, 19:29  [ТС] #8
Цитата Сообщение от soon Посмотреть сообщение
Но лучше переписать код с нуля.
Именно это я и делаю

И ещё такой вопрос - почему появляется ошибка сегментирования, когда я пытаюсь присвоить существующему объекту какие-либо параметры?

Добавлено через 59 секунд
alsav22:
g++ -Wall -c "1.cxx" (в каталоге: /home/\\\/Рабочий стол)
1.cxx: В функции-члене «void Book::AddBook(std::vector<Book>&, short int)»:
1.cxx:36:33: ошибка: нет подходящей функции для вызова «std::vector<Book>:ush_back()»
1.cxx:36:33: замечание: candidate is:
In file included from /usr/include/c++/4.7/vector:65:0,
from 1.cxx:2:
/usr/include/c++/4.7/bits/stl_vector.h:881:7: замечание: void std::vector<_Tp, _Alloc>:ush_back(const value_type&) [with _Tp = Book; _Alloc = std::allocator<Book>; std::vector<_Tp, _Alloc>::value_type = Book]
/usr/include/c++/4.7/bits/stl_vector.h:881:7: замечание: candidate expects 1 argument, 0 provided
Сборка завершилась с ошибкой.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.11.2012, 19:31 #9
Цитата Сообщение от Zoominger Посмотреть сообщение
почему появляется ошибка сегментирования, когда я пытаюсь присвоить существующему объекту какие-либо параметры?
Его не существует. Еще раз перечитайте мои объяснения, касаемо индексирования.
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 19:32 #10
Неправильно написал. Нужно:
C++
1
2
3
4
5
6
7
8
9
void Book::AddBook(vector <Book> &Library)
{
    Book book;
    
    cout << "BBeguTe HA3BAHUE KHUru, rog u3gaHu9l, ABTOPA u }|{AHP: \n";
    cin >> book.Name >> book.Year >> book.Author >> book.Janre;
    Library.push_back(book); // вот это.
    cout << "onepaLLu9l 3aBepLLIEHA ycneLLIHO! \n";
}
0
Zoominger
364 / 253 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
27.11.2012, 19:37  [ТС] #11
Цитата Сообщение от soon Посмотреть сообщение
Его не существует. Еще раз перечитайте мои объяснения, касаемо индексирования.
Прочитал, проверил0 обращение к шестому элементу проходит, Size не нужен в данном случае вообще. Буду переделывать.


Цитата Сообщение от soon Посмотреть сообщение
Прочитайте книгу об ООП, вы его в корне не понимаете.
Читал, читал, но не могу понять, чем классы отличаются от структур (ну кроме функций и прочих полезностей).

Спасибо за помощь, пока буду писать костыли
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.11.2012, 19:38 #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Неправильно написал. Нужно:
Нужно менять архитектуру приложения. Какого черта объект класса должен отдуваться за вектор объектов этого-же класса?
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 19:41 #13
Цитата Сообщение от soon Посмотреть сообщение
Нужно менять архитектуру приложения
Это дело ТС. Я показал, что через push_back() всё нормально добавляется в вектор.
0
Zoominger
364 / 253 / 62
Регистрация: 22.06.2010
Сообщений: 1,566
27.11.2012, 19:44  [ТС] #14
Господа, не ссорьтесь Я решил пока для студенческой лабы оставить в покое добавление нового элемента в вектор, а дать ему фиксированный размер (тут, конечно, смысл его использования теряется, но и чёрт с ним).
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 19:55 #15
Цитата Сообщение от Zoominger Посмотреть сообщение
а дать ему фиксированный размер
У вектора как-бы нет фиксированного размера. Объект с автоматическим управлением памятью. Всегда можно добавить элемент (если памяти системы, конечно, достаточно).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 19:55
Привет! Вот еще темы с ответами:

Вектор из матриц C++, как добавить новый элемент вектора? - C++
У меня такая запись, вектор из матриц vector&lt;int&gt; v(10); Допустим мне надо в конец вектора вставить еще одну матрицу. Как это...

можно ли в вектор добавить вектор? - C++
не сложить, а добавить? например, даны такие векторы: std::vector&lt;glm::vec2&gt; myVector; и vector&lt;вот тут какой тип делать?&gt;...

Добавить объект класса - C++
Всем привет, делаю очередное задание. Мне нужно добавлять записи в &quot;бд&quot;. Базой даных мне должен служить класс, в таком случае, как я...

Не могу добавить объект к множеству - C++
У меня есть функция, которая должна добавить объект в множество которое передается как параметр Была такая, но объект не добавляла: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.11.2012, 19:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru