Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
2 / 2 / 1
Регистрация: 23.06.2014
Сообщений: 110
1

Vector обектов почему не работает?

13.02.2015, 19:40. Показов 2896. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
#include <fstream>
#include <Windows.h>
#include <stdio.h>
 
using namespace std;
 
class Base
{
    string fname;
    string lname;
    string age;
    string crime;
    string term;
    ofstream fout;
    ifstream fin;
    int Position;
public:
    Base(string fname,string lname,string age, string crime,string term, int Position) : fname(fname), lname(lname), age(age), crime(crime), term(term), Position(Position){}
 
    Base() : fname(""), lname(""), age(""), crime(""), term(""), Position(0){}
 
    void Add()
    {
        fout.open("Base.txt");
        Set();
        fout << "Iм'я злочиньця: " << fname << endl;
        fout << "Прiзвище злочиньця: " << lname << endl;
        fout << "Вiк злочиньця: " << age << endl;
        fout << "Вчинений злочин: " << crime << endl;
        fout << "Термiн перебування у вязницi: " << term << endl;
        fout << endl;
        fout.close();
    }
 
    void Set()
    {
        cout << "iм'я злочиньця ";
        cin >> fname;
        cout << "Прiзвище злочиньця ";
        cin >> lname;
        cout << "Вiк злочиньця ";
        cin >> age;
        cout << "Вчинений злочин ";
        cin >> crime;
        cout << "Термiн перебування у вязницi ";
        cin >> term;
        fout.close();
    }
 
    void Delete()
    {
        int vibor;
        fin.open("Base.txt");
        cout << "Що видалити? " << endl;
        cout << "1.Iм'я зличиньця" << endl;
        cout << "2.Прiзвище зличиньця" << endl;
        cout << "3.Вiк зличиньця" << endl;
        cout << "4. Вчинений злочин" << endl;
        cout << "5.Термiн перебування у вязницi" << endl;
        cin >> vibor;
        
    }
    
    void Viem()
    {
        cout << "fname " << fname << endl;
        cout << "lname " << lname << endl;
        cout << "age " << age << endl;
        cout << "crime " << crime << endl;
        cout << "term " << term << endl;
    }
 
    void Searche()
    {
 
    }
 
    void Setfname(string Fname)
    {
        fname = Fname;
    }
 
    void Setlname(string Lname)
    {
        lname = Lname;
    }
 
    void SetAge(string Age)
    {
        age = Age;
    }
 
    void Setcrime(string Crime)
    {
        crime = Crime;
    }
 
    void Setterm(string Term)
    {
        term = Term;
    }
 
    void Setposition(int position)
    {
        Position = position;
    }
};
 
class Program
{
    ifstream fin1;
    ofstream fout1;
    string str;
    Base basetime;
    vector<Base> base;
    int i = 0;
    int mas = 0;
public:
    void SetBase()
    {
        fin1.open("Base.txt");
    //  base.reserve(10);
        //base.push_back(basetime);
        while (!fin1.eof()){
            cout << base.size();
            getline(fin1, str);
            cout << str << endl;
            if (i == 0)
                base[mas].Setfname(str);
 
            if (i == 1)
                base[mas].Setlname(str);
 
            if (i == 2)
                base[mas].SetAge(str);
 
            if (i == 3)
                base[mas].Setcrime(str);
 
            if (i == 4)
                base[mas].Setterm(str);
            i++;
            if (i > 4)
            {
                i = 0;
                base[mas].Setposition(mas);
                base[mas].Viem();
                mas++;
            }
        }
        
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "");
    Base a;
    Program b;
    b.SetBase();
    //a.Add();
    //a.Delete();
    _getch();
    return 0;
}
Когда выделяю память методом base.reserve(); или просто в конец вектора добавляю пустой обьект не хочет работать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2015, 19:40
Ответы с готовыми решениями:

Не работает функция sort (vector, vector)
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;algorithm&gt;...

Почему не заполняется массив vector?
Здравствуйте! Не могу понять, почему не заполняется массив vector.. Он в классе объявлен типа...

Почему объект типа std::vector не читается из потока?
# include &lt;iostream&gt; # include &lt;vector&gt; # include &lt;fstream&gt; using namespace std; int main...

Почему Qt Creator не видит методы элементов std::vector?
Вопрос вроде не сложный. Вообщем создаем вектор, например: std::vector&lt;std::string&gt; vStd; ...

9
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
13.02.2015, 20:06 2
Сообщение об ошибке есть?
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
13.02.2015, 20:06 3
Цитата Сообщение от Antosha Посмотреть сообщение
Когда выделяю память методом base.reserve();
Оно память выделяет, но элементы в векторе не появляются. Помимо выделения памяти, ее нужно инициализировать. Изменить размер вектора с учетом этого можно функцией resize.
А вообще можно так сделать (не компилировал, писал прямо здесь):
C++
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
    void SetBase()
    {
        fin1.open("Base.txt");
 
        std::string str;
        while(std::getline(fin1, str))
        {
            base.push_back(Base());
            Base & curb = base.back();
            switch(i)
            {
            case 0:
                curb.Setfname(str);
                break;
            case 1:
                curb.Setlname(str);
                break;
            case 2:
                curb.SetAge(str);
                break;
            case 3:
                curb.Setterm(str);
                break;
            default:
                i = 0;
                curb.Setposition(mas);
                curb.Viem();
                continue;
            }
            ++i;
        }
    }
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2015, 20:09 4
потому что мемберы в ваших классах некопируемые (ofstream, ifstream), а вектор требует, чтобы
объекты это умели делать.
по идее они у вас мувальные, надо с move-конструкторами копирования похимичить. возможно получится.
точно не скажу. второе решение, которое точно сработает, хранить смарт поинтеры на стримы:
std::shared_ptr<std::ofstream>, std::shared_ptr<ifstream>
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
13.02.2015, 20:17 5
PS. Вообще, этот код не должен компилироваться. Т.к. внутри Base сидят объекты файловых потоков, а их копировать нельзя (вектор требует copy-constructable). Выход: убрать их из класса, создавать в том\тех методах, где они действительно нужны (т.е. непосредственно методах чтения или записи), либо передавать объект потока по ссылке, в нужный метод для записи\чтения. Делать потоки состоянием класса - не нужно.

Добавлено через 1 минуту
Уже ответили
Но в каждом элементе хранить файловый поток, хоть по ссылке, хоть по значению - это нонсенс все равно.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2015, 20:22 6
ну в конкретно приведенном коде они пожлуй лишние к качестве мемберов.
а вообще держать их в смартпоинтерах - вполне себе решение, когда стрим
нужен как мембер класса.
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
13.02.2015, 20:23 7
DU, что значит "не копируемые"? Откуда это?
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
13.02.2015, 20:28 8
Цитата Сообщение от nmcf Посмотреть сообщение
Откуда это?
Из стандарта, вестимо
У потоков закрытые\удаленные конструктор копирования\оператор присвоения.
1
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
13.02.2015, 20:30 9
А это тогда для чего? http://www.cplusplus.com/refer... operator=/
0
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
13.02.2015, 20:31 10
Цитата Сообщение от nmcf Посмотреть сообщение
А это тогда для чего?
Читаем внимательно:
fstream& operator= (const fstream&) = delete;
1
13.02.2015, 20:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2015, 20:31
Помогаю со студенческими работами здесь

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало...

Не работает extern для vector
Добрый день всем. Подскажите пожалуйста в чем беда то? Есть глобальный vector: extern...

Не работает operator<< шаблонного класса Vector
Компилятор выдает ошибку error LNK2019: unresolved external symbol &quot;class...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru