Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
#1

Преобразование типов

14.06.2016, 21:39. Просмотров 226. Ответов 14
Метки нет (Все метки)

Возможно ли преобразовать vector <Transport_Vehicle*> Cars_for_transportation в vector <MotorCar*> Cars_for_transportation
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2016, 21:39
Ответы с готовыми решениями:

Преобразование типов
Вопрос по преобразованию строки в число , и наоборот . Например на форме...

Преобразование типов
Господа, мое терпение и срок, отведенный мне на решение задачи начальством,...

Преобразование типов
Цель копировать из одного объекта в другой инофрмацию, типы разные, поэтому...

Преобразование типов.
Подскажите как правильно преобразовать типы в следующем фрагменте: int i;...

Преобразование типов
Кто знает, как преобразовать std::string в какой-либо другой тип?...

14
nmcf
6265 / 5575 / 2534
Регистрация: 14.04.2014
Сообщений: 23,468
15.06.2016, 11:25 #2
Тип или объект? Подробнее.
0
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 13:51  [ТС] #3
MotorCar является наследником Transport_Vehicle.
С вектора, в котором находятся разные транспортные средства, я вытаскиваю объекты класса MotorCar с помощью typeid, но вытаскиваю в вектор опять таки <Transport_Vehicle*>. Чтобы исключить объекты, которые не удовлетворяют условию задания, мне требуются методы класса MotorCar, но они недоступны, так как вектор содержит указатели на Transport_Vehicle.
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
15.06.2016, 14:00 #4
С помощью dynamic_cast<>() проверяете, является ли данный Transport_Vehicle объектом класса MotorCar. Если да, то добавляете в вектор.
Примерно так:
C++
1
2
3
4
5
6
7
8
9
//vect - std::vector< Transport_Vehicle * >
//vecm - std::vector< MotorCar * >
 
for ( int i = 0; i < vect.size(); i++ ) {
   MotorCar *mp = dynamic_cast< MotorCar * >( vect[ i ] );
   
   if ( mp )
      vecm.push_back( mp ).
}
0
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 14:24  [ТС] #5
Вытащить в отдельный вектор получилось. Спасибо большое:-D

Добавлено через 2 минуты
Если не трудно, укажите какая есть ошибка. При компиляции ничего не выдает, а вот в ходе выполнения выбивает "Прекращена работа программы Car.exe"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Garage :: Best_for_transportation(Garage g1, int passengers, int luggage_weight)
{
vector <MotorCar*> Cars_for_transportation;
 
for ( int i = 0; i < transport.size(); i++ ) 
   {
       MotorCar *с = dynamic_cast< MotorCar * >( transport[ i ] );
        if ( с)
        Cars_for_transportation.push_back( с );
   }
   for (int i=0; i<Cars_for_transportation.size(); i++)
       Cars_for_transportation[i]->show();
}
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
15.06.2016, 14:28 #6
По одному куску нельзя сказать, нужен весь код. И оформляйте, пожалуйста, код в соответсвующий тэг.
0
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 14:37  [ТС] #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Garage :: Best_for_transportation(Garage g1, int passengers, int luggage_weight)
{
vector <MotorCar*> Cars_for_transportation;
 
for ( int i = 0; i < transport.size(); i++ ) 
   {
       MotorCar *c = dynamic_cast< MotorCar * >( transport[ i ] );
        if ( c )
        Cars_for_transportation.push_back( c );
   }
   for (int i=0; i<Cars_for_transportation.size(); i++)
       Cars_for_transportation[i]->show();
}


C++
1
2
3
4
5
6
7
8
9
10
11
12
void MotorCar::show()
{
    cout << "Weight of the car:" << weight << endl
        << "The maximum speed of the car:" << top_speed << endl
        << "Fuel consumption per 100 km:" << fuel << endl
        << "Maximum possible baggage transported:" << luggage_weight << endl
        << "Car class:" << Ccar << endl
        << "Body type car:" << body << endl
        << "The maximum possible number of passengers:" << passengers << endl
        << "Type of seat upholstery:" << seat << endl;
    cout << endl;
}
Эта функция работает

C++
1
2
3
4
5
void Garage::cout_transport_in_garage() const
{
    for (int i = 0; i<size_garage(); i++)
        transport[i]->show();
}
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
15.06.2016, 14:46 #8
Нужен именно весь код, включая функцию main, в этих кусках ничего такого нет. Разве что здесь
C++
1
2
for (int i = 0; i<size_garage(); i++)
        transport[i]->show();
не понятно, что возвращает size_garage(). Лучше заменить на transport.size()
0
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 14:53  [ТС] #9
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
class Transport_Vehicle
{
protected:
    int weight;  //вес транспортного средства
    double top_speed; //максимальная скорость
    double fuel;  //расход топлива в литрах на 100 км
public:
    Transport_Vehicle(int weight, double top_speed, double fuel) : weight(weight), top_speed(top_speed), fuel(fuel){}; // конструктор с параметрами для транспортного средства
    virtual void show() = 0;
    int get_weight(){return weight;}
    double get_fuel(){return fuel;}
    void set_fuel(double new_fuel) { fuel = new_fuel; }
    virtual ~Transport_Vehicle(){}; //деструктор для класса транспортного средств
};
 
 
 
enum body_type { sedan, universal, hatchback, cabriolet, minivan, suv }; //тип кузова : седан, универсал, хетчбек, кабриолет, минивэн, внедорожник
enum seat_upholstery{ n_tissue, leather, leatherette }; // тип обивки сидений : обычная ткань, кожа, кожзаменитель
enum class_Mcar { mini_car, small_car, medium_car, larger_car, executive_car, luxuty_car, sport_coupes, multi_purpose_car, sports_utility }; //класс/сегмент легкового автомобиля
 
class MotorCar :public Transport_Vehicle  //класс легковой автомобиль
{
protected:
    int passengers;
    int luggage_weight; //макс вес багажа для автомобиля
    class_Mcar Ccar; //класс/сегмент 
    body_type body; //тип кузова
    seat_upholstery seat; //тип обивки сидений
    void normalize() const;
    
public:
    MotorCar(int weight, double top_speed, double fuel, int passengers, int luggage_weight, class_Mcar Ccar, body_type body, seat_upholstery seat)
        : Transport_Vehicle(weight, top_speed, fuel), passengers(passengers), luggage_weight(luggage_weight), Ccar(Ccar), body(body), seat(seat){
        normalize();
    }; //конструктор с параметрами для легкового автомобиля
    void show();
    friend istream & operator>>(istream & i, MotorCar & m1); //перегрузка потока ввода для обьектов класса легковой автомобиль
    friend ostream & operator<<(ostream & o, const MotorCar & m1);// перегрузка потока вывода для обьектов класса легковой автомобиль
    int get_luggage_weight(){ return luggage_weight; }
    int get_passengers(){ return passengers; }
    int Comfort() const; //вычисление комфорта при перевозки пассажиров автомобилем
    void What_comfort_of_motorcar();
};
 
 
class Motorbike : public Transport_Vehicle  //класс мотоцикл
{
private:
    int passengers;
    bool carriage; //наличие коляски
    void normalize() const;
    int Comfort() const; //вычисление комфорта при перевозке пассажаров мотоциклом
public:
    Motorbike(int weight, double top_speed, double fuel, int passengers, bool carriage) : Transport_Vehicle(weight, top_speed, fuel), passengers(passengers), carriage(carriage){ normalize(); }; //конструктор с параметрами для мотоцикла
    void show();
    friend istream & operator>>(istream & i, Motorbike & b1); //перегрузка потока ввода для обьектов класса мотоцикл
    friend ostream & operator<<(ostream & o, const Motorbike & b1);// перегрузка потока вывода для обьектов класса мотоцикл
    void What_comfort_of_motorbike();
 
};
 
 
 
class Truck : public Transport_Vehicle //класс грузовик
{
private:
    int lifting_capability; //грузоподьемность
    void normalize() const;
public:
    Truck(int weight, double top_speed, double fuel, int lifting_capability) :
        Transport_Vehicle(weight, top_speed, fuel), lifting_capability(lifting_capability){
        normalize();
    }; //конструктор с параметрами для грузового автомобиля
    void show();
    friend istream & operator>>(istream & i, Truck & t1);//перегрузка потока ввода для обьектов класса грузовик
    friend ostream & operator<<(ostream & o, const Truck & t1);// перегрузка потока вывода для обьектов класса грузовик
};
 
 
enum convenience_of_visions { bad, well, very_good }; // вид из окна
enum size{ small, large, extra_large };  // размер 
 
class Bus : public Transport_Vehicle // класс автобус
{
private:
    int passengers;
    bool conditioner; // наличие кондиционера
    bool reclining_seat; //наличие откидывающихся кресел
    convenience_of_visions vision; // удобство видений
    int luggage_weight_p; //максимально возможный багаж для каждого пассажира
    size size_bus; // размер автобуса
    void normalize() const;
    int Comfort() const; //вычисление комфорта при перевозке пассажиров в автобусе
public:
    Bus(int weight, double top_speed, double fuel, int passengers, bool conditioner, bool reclining_seat, convenience_of_visions vision, int luggage_weight_p, size size_bus) :
        Transport_Vehicle(weight, top_speed, fuel), passengers(passengers), conditioner(conditioner), reclining_seat(reclining_seat), vision(vision), luggage_weight_p(luggage_weight_p), size_bus(size_bus){
        normalize();
    };
    void show();
    friend istream & operator>>(istream & i, Bus & bs1);//перегрузка потока ввода для обьектов класса автобус
    friend ostream & operator<<(ostream & o, const Bus & bs1);// перегрузка потока вывода для обьектов класса автобус
    void What_comfort_of_bus();
 
};
 
 
 
 
class Garage // класс Гараж, содержащий различные транспортные средства
{
protected:
    vector <Transport_Vehicle*> transport;  
public:
    ~Garage();
    void menu();
 
    void Add_MotorCar(int  weight, double  top_speed, double  fuel, int passengers, int luggage_weight, class_Mcar  Ccar, body_type  body, seat_upholstery  seat);
    void Add_Motorbike(int  weight, double  top_speed, double  fuel, int passengers, bool  carriage);
    void Add_Truck(int  weight, double  top_speed, double  fuel, int  lifting_capability);
    void Add_Bus(int  weight, double  top_speed, double  fuel, int  passengers, bool conditioner, bool  reclining_seat, convenience_of_visions vision, int  luggage_weight_p, size size_bus);
    void Best_for_transportation(Garage g1, int passengers, int luggage_weight);
    void cout_transport_in_garage() const;
    void delete_transport(unsigned number);
};
0
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 14:55  [ТС] #10
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
void MotorCar::show()
{
    cout << "Weight of the car:" << weight << endl
        << "The maximum speed of the car:" << top_speed << endl
        << "Fuel consumption per 100 km:" << fuel << endl
        << "Maximum possible baggage transported:" << luggage_weight << endl
        << "Car class:" << Ccar << endl
        << "Body type car:" << body << endl
        << "The maximum possible number of passengers:" << passengers << endl
        << "Type of seat upholstery:" << seat << endl;
    cout << endl;
}
 
void MotorCar::normalize() const
{
    switch (Ccar)
    {
    case 0:
    {
              if (body == hatchback)
              {
                  if ((weight>1065 || weight < 875) || (top_speed>160 || top_speed<144) || (fuel<3.8 || fuel>8.6) || (passengers>5 || passengers < 4) || (luggage_weight<50 || luggage_weight>120))
                      throw Transport_Vehicle_Error();
              }
              else
                  throw Transport_Vehicle_Error();
    } break;
    case 1:
    {
              if (body != sedan && body != universal && body != hatchback)
                  throw Transport_Vehicle_Error();
              else
              {
                  if (body == sedan)
                  {
                      if ((weight>1200 || weight<1010) || (top_speed>155 || top_speed<144) || (fuel<5.1 || fuel>9.8) || (passengers >5 || passengers<4) || (luggage_weight<140 || luggage_weight>220))
                          throw Transport_Vehicle_Error();
                  }
                  if (body == universal)
                  {
                      if ((weight>1100 || weight<995) || (top_speed>160 || top_speed<150) || (fuel<5.3 || fuel>7.9) || (passengers >5 || passengers<4) || (luggage_weight<147 || luggage_weight>230))
                          throw Transport_Vehicle_Error();
                  }
                  if (body == hatchback)
                  {
                      if ((weight>1190 || weight<1005) || (top_speed>140 || top_speed<135) || (fuel<4.5 || fuel>8.3) || (passengers >5 || passengers<4) || (luggage_weight<136 || luggage_weight>213))
                          throw Transport_Vehicle_Error();
                  }
              }
    } break;
    case 2:
    {
              if (body != sedan && body != universal && body != hatchback)
                  throw Transport_Vehicle_Error();
              else
              {
                  if (body == sedan)
                  {
                      if ((weight>1450 || weight<1280) || (top_speed>184 || top_speed<173) || (fuel<4.9 || fuel>7.2) || (passengers >5 || passengers<4) || (luggage_weight<130 || luggage_weight>190))
                          throw Transport_Vehicle_Error();
                  }
                  if (body == universal)
                  {
                      if ((weight>1350 || weight<1180) || (top_speed>190 || top_speed<176) || (fuel<5.1 || fuel>8.7) || (passengers >5 || passengers<4) || (luggage_weight<165 || luggage_weight>250))
                          throw Transport_Vehicle_Error();
                  }
                  if (body == hatchback)
                  {
                      if ((weight>1440 || weight<1296) || (top_speed>174 || top_speed<167) || (fuel<6.3 || fuel>10.5) || (passengers >5 || passengers<4) || (luggage_weight<168 || luggage_weight>260))
                          throw Transport_Vehicle_Error();
                  }
              }
    } break;
    case 3:
    {
              if (body != sedan && body != universal && body != hatchback) throw Transport_Vehicle_Error();
              else
              {
                  if (body == sedan)
                  {
                      if ((weight>1730 || weight<1587) || (top_speed>205 || top_speed<193) || (fuel<4.3 || fuel>5.0) || (passengers >5 || passengers<4) || (luggage_weight<190 || luggage_weight>270))
                          throw Transport_Vehicle_Error();
                  }
                  if (body == universal)
                  {
                      if ((weight>1273 || weight<1026) || (top_speed>225 || top_speed<213) || (fuel<5.0 || fuel>7.7) || (passengers >5 || passengers<4) || (luggage_weight<210 || luggage_weight>300))
                          throw Transport_Vehicle_Error();
                  }
                  if (body == hatchback)
                  {
                      if ((weight>1585 || weight<1356) || (top_speed>222 || top_speed<206) || (fuel<5.8 || fuel>13.0) || (passengers >5 || passengers<4) || (luggage_weight<170 || luggage_weight>248))
                          throw Transport_Vehicle_Error();
                  }
 
              }
    } break;
    case 4:
    {   if (seat != leather) throw Transport_Vehicle_Error();
    else
    if (body != sedan && body != universal && body != hatchback)
        throw Transport_Vehicle_Error();
    else
    {
        if (body == sedan)
        {
            if ((weight>1620 || weight<1275) || (top_speed>243 || top_speed<224) || (fuel<7.3 || fuel>14.0) || (passengers >5 || passengers<4) || (luggage_weight<250 || luggage_weight>284))
                throw Transport_Vehicle_Error();
        }
        if (body == universal)
        {
            if ((weight>1885 || weight<1530) || (top_speed>250 || top_speed<219) || (fuel<5.2 || fuel>11.9) || (passengers >5 || passengers<4) || (luggage_weight<230 || luggage_weight>262))
                throw Transport_Vehicle_Error();
        }
        if (body == hatchback)
        {
            if ((weight>2000 || weight<1740) || (top_speed>255 || top_speed<238) || (fuel<5.3 || fuel>12.3) || (passengers >5 || passengers<4) || (luggage_weight<265 || luggage_weight>290))
                throw Transport_Vehicle_Error();
        }
    }
    } break;
    case 5:
    {
              if (body == sedan && seat == leather)
              {
                  if ((weight>2000 || weight<1620) || (top_speed>250 || top_speed<220) || (fuel<5.6 || fuel>13.6) || (passengers >5 || passengers<4) || (luggage_weight<80 || luggage_weight>120))
                      throw Transport_Vehicle_Error();
              }
              else
                  throw Transport_Vehicle_Error();
    } break;
    case 6:
    {
              if (body == cabriolet && (seat == leather || seat == leatherette))
              {
                  if ((weight<1310 || weight>1600) || (top_speed>264 || top_speed<182) || (fuel<4.7 || fuel>13.0) || (passengers >4 || passengers<2) || (luggage_weight<50 || luggage_weight>120))
                      throw Transport_Vehicle_Error();
              }
              else
                  throw Transport_Vehicle_Error();
    } break;
    case 7:
    {
              if (body == minivan)
              {
                  if ((weight>1900 || weight<1630) || (top_speed>198 || top_speed<173) || (fuel<4.8 || fuel>12.3) || (passengers >9 || passengers<5) || (luggage_weight<160 || luggage_weight>215))
                      throw Transport_Vehicle_Error();
              }
              else
                  throw Transport_Vehicle_Error();
    } break;
    case 8:
    {
              if (body == suv)
              {
                  if ((weight>2700 || weight<1930) || (top_speed>240 || top_speed<190) || (fuel<5.6 || fuel>20.6) || (passengers >9 || passengers<4) || (luggage_weight<300 || luggage_weight>480))
                      throw Transport_Vehicle_Error();
              }
              else
                  throw Transport_Vehicle_Error();
    } break;
 
    }
}
 
 
istream & operator>>(istream & i, MotorCar & m1)
{
    i >> m1.weight >> m1.top_speed >> m1.fuel >> m1.luggage_weight >> (int&)m1.Ccar >> (int&)m1.body >> m1.passengers >> (int&)m1.seat;
 
    return i;
 
}
 
ostream & operator<<(ostream & o, const MotorCar & m1)
{
    o << m1.weight << '\t' << m1.top_speed << '\t' << m1.fuel << '\t' << m1.luggage_weight << '\t' << (int&)m1.Ccar << '\t' << (int&)m1.body << '\t' << m1.passengers << '\t' << (int&)m1.seat << endl;
    return o;
};
 
 
int MotorCar::Comfort() const
{
    int comfort = 0; //индикатор комфорта
    switch (seat) // комфорт по типу сидений
    {
    case leather: comfort = comfort + 2; break; //сидения из кожи - комфорт+2
    case leatherette: comfort = comfort + 1; break; // сидения из кожзаменителя - комфорт+1
    default: comfort = comfort; // сидения из обычной ткани - комфорт+0
    };
    switch (body) // комфорт по типу кузова
    {
    case suv: comfort = comfort + 6; break; //кузов внедорожник - комфорт+6
    case cabriolet: comfort = comfort + 5; break;  // кузов кабриолет - комфорт+5
    case hatchback: comfort = comfort + 4; break; // кузов хетчбек - комфорт+4
    case universal: comfort = comfort + 3; break; // кузов универсал - комфорт+3
    case sedan: comfort = comfort + 2; break; // кузов седан - комфорт+2
    default: comfort = comfort + 1; //кузов минивэн - комфорт+1
    };
    switch (Ccar) // комфорт по классу автомобиля
    {
    case luxuty_car: comfort = comfort + 6; break;  // представительский класс - комфорт+6
    case executive_car: comfort = comfort + 5; break; // бизнес класс - комфорт+5
    case larger_car: case multi_purpose_car: case sports_utility: comfort = comfort + 4; break; // большие семейные автомобили, внедорожник, минивэн или универсал повышенной стоимости - комфорт+4
    case small_car:case medium_car: case sport_coupes: comfort = comfort + 2; break; // малые автомобили, низший средний класс, класс купе - комфорт+2
    default: comfort = comfort + 1; // микроавтомобили - комфорт+1
    };
 
    return comfort;
 
 
}
void MotorCar::What_comfort_of_motorcar()
{
    switch (Comfort())
    {
    case 13: case 14: case 15: cout << "This car is the most comfortable for passengers\n"; break; //высокий комфорт перевозки пассажиров 
    case 9: case 10: case 11: case 12: cout << "This car has a medium comfort to passengers\n"; break; // средний комфорт перевозки пассажиров
    default: cout << "This car has a low comfort to passengers\n"; // низкий комфорт перевозки пассажиров
    };
}
 
void Motorbike::show()
{
    cout << "Weight of the motorcycle:" << weight << endl
        << "The maximum speed of the motorcycle:" << top_speed << endl
        << "Fuel consumption per 100 km:" << fuel << endl
        << "Availability of wheelchairs in motorcycle:" << carriage << endl;
    cout << endl;
}
 
void Motorbike::normalize() const
{
    if (!carriage)
    {
        if ((weight>400 || weight<60) || (top_speed >380 || top_speed < 60) || (fuel<2 || fuel>10.7))
            throw Transport_Vehicle_Error();
    }
    else
    {
        if ((weight>500 || weight<90) || (top_speed > 110 || top_speed < 40) || (fuel <2 || fuel>11))
            throw Transport_Vehicle_Error();
    }
}
 
 
istream & operator>>(istream & i, Motorbike & b1)
{
    i >> b1.weight >> b1.top_speed >> b1.fuel >> b1.passengers >> b1.carriage;
    return i;
}
 
 
ostream & operator<<(ostream & o, const Motorbike & b1)
{
    o << "weight=" << b1.weight << '\t' << "top speed=" << b1.top_speed << '\t' << "fuel=" << b1.fuel << '\t' << "passengers=" << b1.passengers << '\t' << "carriage=" << b1.carriage << endl;
    return o;
}
 
 
int Motorbike::Comfort() const
{
    if (carriage) // наличие коляски
        return 1;
    else // отсутствие коляски
        return 0;
}
 
void Motorbike::What_comfort_of_motorbike()
{
    if (Comfort())
        cout << "This motorcycle is comfortable for passengers\n"; //комфортный для перевозки пассажиров
    else
        cout << "This motorcycle has a low level of comfort to passengers\n"; // имеет низкий комфорт при перевозке пассажиров
}
 
 
 
 
void Truck::show()
{
    cout << "Weight of the truck:" << weight << endl
        << "The maximum speed of the truck:" << top_speed << endl
        << "Fuel consumption per 100 km:" << fuel << endl
        << "Truck load" << lifting_capability << endl;
    cout << endl;
}
 
void Truck::normalize() const
{
    if (weight<1000 || weight > 20000)
        throw Transport_Vehicle_Error();
    else
    {
        if (weight <= 3500 && ((top_speed < 50 || top_speed > 120) || (fuel <10 || fuel > 20) || (lifting_capability>2500 || lifting_capability<600)))
            throw Transport_Vehicle_Error();
        if ((weight>3500 && weight<12000) && ((top_speed<60 || top_speed>120) || (fuel<15 || fuel >25) || (lifting_capability > 8000 || lifting_capability<2000)))
            throw Transport_Vehicle_Error();
        if ((weight >= 12000 && weight <= 20000) && ((top_speed < 50 || top_speed >100) || (fuel <20 || fuel >30) || (lifting_capability > 25000 || lifting_capability<7000)))
            throw Transport_Vehicle_Error();
    }
}
 
istream & operator>>(istream & i, Truck & t1)
{
    i >> t1.weight >> t1.top_speed >> t1.fuel >> t1.lifting_capability;
    return i;
}
 
ostream & operator<<(ostream & o, const Truck & t1)
{
    o << t1.weight << '\t' << t1.top_speed << '\t' << t1.fuel << '\t' << t1.lifting_capability << endl;
    return o;
}
0
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 14:56  [ТС] #11
продолжение
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
void Bus::show()
{
    cout << "Weight of the bus:" << weight << endl
        << "The maximum speed of the bus:" << top_speed << endl
        << "Fuel consumption per 100 km:" << fuel << endl
        << "The maximum possible number of passengers in bus:" << passengers << endl
        << "AIR-CONDITIONING in bus:" << conditioner << endl
        << "Availability of reclining chairs in bus:" << reclining_seat << endl
        << "Convenience visions in bus:" << vision << endl
        << "The maximum possible weight of carried baggage for each passenger of the bus:" << luggage_weight_p << endl;
    cout << endl;
}
 
void Bus::normalize() const
{
    if (size_bus == 0)
    if ((weight<5000 || weight > 6000) || (top_speed > 90 || top_speed <40) || (fuel<9 || fuel>20) || (passengers>30 || passengers<14) || (luggage_weight_p>20 || luggage_weight_p <10))
        throw Transport_Vehicle_Error();
    if (size_bus == 1)
    if ((weight<6000 || weight > 10000) || (top_speed > 90 || top_speed < 40) || (fuel < 12 || fuel >36) || (passengers>50 || passengers<30) || (luggage_weight_p>30 || luggage_weight_p <15))
        throw Transport_Vehicle_Error();
    if (size_bus == 2)
    if ((weight<10000 || weight > 18000) || (top_speed > 80 || top_speed< 40) || (fuel<35 || fuel>50) || (passengers>280 || passengers<50) || (luggage_weight_p>50 || luggage_weight_p <20))
        throw Transport_Vehicle_Error();
}
 
 
istream & operator>>(istream & i, Bus & bs1)
{
    i >> bs1.weight >> bs1.top_speed >> bs1.fuel >> bs1.passengers >> bs1.conditioner >> bs1.reclining_seat >> (int&)bs1.vision >> bs1.luggage_weight_p >> (int&)bs1.size_bus;
    return i;
}
 
ostream & operator<<(ostream & o, const Bus & bs1)
{
    o << bs1.weight << '\t' << bs1.top_speed << '\t' << bs1.fuel << '\t' << bs1.passengers << '\t' << bs1.conditioner << '\t' << bs1.reclining_seat << '\t' << bs1.vision << '\t' << bs1.luggage_weight_p << '\t' << bs1.size_bus << endl;
    return o;
}
 
int Bus::Comfort() const
{
    int comfort = 0; //индикатор комфорта
    if (conditioner) // наличие кондиционера
        comfort = comfort + 1;
    if (reclining_seat) // наличие откидывающих кресел
        comfort = comfort + 1;
    switch (vision) // комфорт по удобстве видений
    {
    case very_good: comfort = comfort + 2; break; // отличные видения - комфорт+2
    case well: comfort = comfort + 1; break; // хорошие видения - комфорт+1
    default: comfort = comfort; // плохие видения - комфорт+0
    }
    return comfort;
 
}
 
void Bus::What_comfort_of_bus()
{
    switch (Comfort())
    {
    case 4: cout << "This bus is comfortable for passengers\n"; break; // комфортный для перевозки пассажиров
    case 3: case 2: cout << "This bus has a medium comfort to passengers\n"; break; //имеет средний комфорт при перевозке пассажиров
    default: cout << "This bus has a low level of comfort to passengers\n"; // имеет низкий комфорт при перевозке пассажиров
    };
}
 
 
 
Garage :: ~Garage()
{
    for(unsigned i=0; i<transport.size(); i++)
        delete transport[i];
}
 
 
void Garage::Add_MotorCar(int weight, double top_speed, double fuel, int passengers, int luggage_weight, class_Mcar Ccar, body_type body, seat_upholstery seat)
{
    transport.push_back(new MotorCar(weight, top_speed, fuel, passengers, luggage_weight, Ccar, body, seat));
}
 
 
void Garage::Add_Motorbike(int weight, double top_speed, double fuel, int passengers, bool carriage)
{
    transport.push_back(new Motorbike(weight, top_speed, fuel, passengers, carriage));
}
 
 
void Garage::Add_Truck(int weight, double top_speed, double fuel, int lifting_capability)
{
    transport.push_back(new Truck(weight, top_speed, fuel, lifting_capability));
}
 
 
void Garage::Add_Bus(int weight, double top_speed, double fuel, int passengers, bool conditioner, bool reclining_seat, convenience_of_visions vision, int luggage_weight_p, size size_bus)
{
    transport.push_back(new Bus(weight, top_speed, fuel, passengers, conditioner, reclining_seat, vision, luggage_weight_p, size_bus));
}
 
 
 
void Garage::cout_transport_in_garage() const
{
    for (int i = 0; i<transport.size(); i++)
        transport[i]->show();
}
 
void Garage :: Best_for_transportation(Garage g1, int passengers, int luggage_weight)
{
vector <MotorCar*> Cars_for_transportation;
 
for ( int i = 0; i < transport.size(); i++ ) 
   {
       MotorCar *c = dynamic_cast< MotorCar * >( transport[ i ] );
        if ( c )
        Cars_for_transportation.push_back( c );
   }
   for (int i=0; i<Cars_for_transportation.size(); i++)
       Cars_for_transportation[i]->show();
}
 
void Garage::delete_transport(unsigned number)
{
    if (number >= transport.size())
        throw exception();
    delete transport[number];
    transport.erase(transport.begin() + number);
}
Добавлено через 18 секунд
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
    Garage Basic_Garage;
    Basic_Garage.Add_MotorCar(2500, 200, 15, 6, 400, sports_utility, suv, leatherette);
    Basic_Garage.Add_MotorCar(1790, 185, 8, 8, 180,  multi_purpose_car, minivan, n_tissue);
    Basic_Garage.Add_Motorbike(200, 260, 7, 1, 0);
    Basic_Garage.Add_Bus(5600, 60, 15, 25, 1, 1, well, 10, small);
    Basic_Garage.Add_Bus(11000, 60, 45, 110, 1, 1, well, 30, extra_large);
    Basic_Garage.Add_Truck(3000, 80, 12, 1500);
    Basic_Garage.Add_MotorCar(1980, 240, 8.3, 4, 270, executive_car, hatchback, leather);
    Basic_Garage.Add_Motorbike(240, 90, 9.3, 2, 1);
    Basic_Garage.Add_MotorCar(1200, 185, 6.3, 4, 190,  medium_car, universal, leatherette);
    Basic_Garage.Add_Truck(14000, 60, 21, 17000);
    Basic_Garage.Add_Bus(7500, 70, 28, 45, 1, 0, well, 20, large);
    Basic_Garage.Add_Motorbike(450, 100, 9.4, 2, 1);
    Basic_Garage.Add_MotorCar(1100, 150, 7.2, 4, 165,  small_car, sedan, n_tissue);
    Basic_Garage.Add_Bus(14000, 65, 44, 180, 1, 1, well, 45, extra_large);
    Basic_Garage.Add_MotorCar(1450, 250, 8.6, 2, 90, sport_coupes, cabriolet, leather);
    Basic_Garage.Add_MotorCar(1760, 175, 7.8, 7, 200, multi_purpose_car, minivan, leatherette);
    Basic_Garage.Add_Truck(9000, 100, 17, 6500);
    Basic_Garage.Add_MotorCar(1800, 230, 10.4, 4, 105, luxuty_car, sedan, leather);
    Basic_Garage.Add_Bus(7600, 75, 16, 40, 0, 0, bad, 24, large);
    Basic_Garage.Add_Motorbike(350, 320, 8.5, 1, 0);
    Basic_Garage.Add_MotorCar(900, 145, 5, 4,  80, mini_car, hatchback, n_tissue);
    Basic_Garage.Add_Truck(11000, 90, 22, 7600);
    Basic_Garage.Add_Motorbike(300, 340, 10, 1, 0);
    Basic_Garage.Add_MotorCar(1150, 215, 6, 4,  270, larger_car, universal, leatherette);
    Basic_Garage.Add_Bus(5300, 80, 13, 22, 0, 1, well, 16, small);
        Basic_Garage.cout_transport_in_garage();
    cout << endl;
    cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
    Basic_Garage.Best_for_transportation(Basic_Garage, 3, 150);
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
15.06.2016, 15:14 #12
Падает, потому что вот здесь:
C++
1
Basic_Garage.Best_for_transportation(Basic_Garage, 3, 150);
Гараж копируется, копируется в том числе и вектор с указателями. После того, как функция Best_for_transportation завершится, объект уничтожится, вызовется деструктор, который удалит все машины. Потом, по завершению функции main, будет уничтожаться объект Basic_Garage. Но объекты, которые хранятся в его векторе, уже уничтожены. В итоге оператор delete вызывается для одного и того же адреса дважды, что приводит к вылету.

Не понятно, зачем гаражу передавать себя же в функцию.
1
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 15:15  [ТС] #13
Ага, сейчас исправим)
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
15.06.2016, 15:16 #14
Меняете прототип на
C++
1
void Garage :: Best_for_transportation(int passengers, int luggage_weight)
, а вызов на
C++
1
Basic_Garage.Best_for_transportation(3, 150);
1
User4408
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 16
15.06.2016, 15:18  [ТС] #15
Спасибо большое, теперь не падает:-)
0
15.06.2016, 15:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2016, 15:18

Преобразование типов
Вообщем допустим есть два класа, класс T и класс A, комплексные числа в разной...

Преобразование типов
С учебника переписал код на применение структур, но возникла проблема с...

С++ преобразование типов
Есть переменная целочисленного типа например int A(например 2356).Нужно...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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