Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.03.2015
Сообщений: 11

Наследование классов

08.11.2016, 16:41. Показов 2207. Ответов 5

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Стоит следующая учебная задача: есть 3 класса потомка (в моем случае типы авто: легковое, грузовое, автобус) с разными элементами и есть базовый класс с общим свойством (мощность двигателя). Данные нужно взять из текстового файла, заполнить соответствующий типу авто подкласс (из подкласса заполняем общее свойство) и сохранить в двусвязный список. Дальше отсортировать пузырьковой сортировкой по общему свойству и вывести.

Мои потуги привели к созданию 3х списков для автобусов, легковушек и грузовиков в которых хранятся данные соответствующих классов. А теперь сам вопрос: каким способом можно все это отсортировать? Можно конечно отсортировать каждый список по отдельности, а дальше сравнивать наименьшие по общему свойству элементы в каждом из них, но это на мой взгляд дикий костыль т.к. размер у каждого списка абсолютно разный, такого подхода хотелось бы избежать и реализовать все одной сортировкой. Можно ли как-нибудь объединить 3 списка в 1 и отсортировать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2016, 16:41
Ответы с готовыми решениями:

Автоматическая генерация классов С ++ с UML диаграмм классов. Наследование в с++. Абстрактные классы. WhiteStarUML
Создать классовую модель(желательно в WhiteStarUML), которая включает в себя абстрактный класс CGraphicsObject, его наследник - базовый...

Заменить наследование классов на наследование интерфейсов
#include <iostream> #include <assert.h> using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование классов. Копирование производных классов
Здравствуйте всем, у меня такой вопрос: написал код #include "stdafx.h" class A //Создаем класс А { int mA; ...

5
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.11.2016, 17:47
Лучший ответ Сообщение было отмечено I am so sorry как решение

Решение

Цитата Сообщение от I am so sorry Посмотреть сообщение
Мои потуги привели к созданию 3х списков для автобусов, легковушек и грузовиков
Вам нужен один список, типом которого будет указатель на базовый класс. Сортировку можно производить по общему свойству, которое должно быть объявлено в базовом классе.

Добавлено через 17 минут
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
#include <iostream>
#include <list>
 
class Car
{
public:
    Car(const int pwr) : m_enginePower(pwr) {}
    virtual ~Car() = default;
    int getEnginePower() const { return m_enginePower; }
    virtual int getType() const = 0; // just make class abstract
protected:
    int m_enginePower;
};
 
class PassengerCar : public Car
{
public:
    using Car::Car;
    int getType() const override { return 1; }
};
 
class Truck : public Car
{
public:
    using Car::Car;
    int getType() const override { return 2; }
};
 
class Bus : public Car
{
public:
    using Car::Car;
    int getType() const override { return 3; }
};
 
int main()
{
    std::list<Car *> cars = {new Bus(42), new Truck(11), new PassengerCar(22), new Truck(777)};
    // в компараторе "учим" компилятор сравнивать объекты типа Car
    cars.sort([](const Car *lhs, const Car *rhs) { return lhs->getEnginePower() < rhs->getEnginePower(); });
    for (const auto p : cars)
    {
        std::cout << p->getEnginePower() << " with type " << p->getType() << std::endl;
        delete p;
    }
}
Добавлено через 23 минуты
Хотя лучше, конечно, использовать smart pointer-ы
C++
1
2
3
4
5
6
7
8
9
int main()
{
    std::unique_ptr<Car> init[] = { std::make_unique<Bus>(42), std::make_unique<Truck>(11), std::make_unique<PassengerCar>(22), std::make_unique<Truck>(777) };
    std::list<std::unique_ptr<Car>> cars { std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init)) };
    // в компараторе "учим" компилятор сравнивать объекты типа Car
    cars.sort([](const std::unique_ptr<Car> &lhs, const std::unique_ptr<Car> &rhs) { return lhs->getEnginePower() < rhs->getEnginePower(); });
    for (const auto &p : cars)
        std::cout << p->getEnginePower() << " with type " << p->getType() << std::endl;
}
4
0 / 0 / 0
Регистрация: 14.03.2015
Сообщений: 11
18.11.2016, 18:53  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Хотя лучше, конечно, использовать smart pointer-ы
Благодарю за помощь! Но не могу разобраться как с умными указателями закидывать данные в элементы классов PassengerCar, Bus, Truck. Подскажите
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.11.2016, 19:19
Цитата Сообщение от I am so sorry Посмотреть сообщение
не могу разобраться как с умными указателями закидывать данные в элементы классов PassengerCar, Bus, Truck. Подскажите
Если в конструкторе, так я показал в примере выше.
C++
1
std::unique_ptr<Car> init[] = { std::make_unique<Bus>(42), std::make_unique<Truck>(11), std::make_unique<PassengerCar>(22), std::make_unique<Truck>(777) };
std::make_unique принимает параметры и передаёт их классу, который указан как параметр шаблона (в угловых скобках). А так, с данными можно работать абсолютно идентично как с указателем, с единственной разницей, что его нельзя копировать (но вам это и не требуется).
0
0 / 0 / 0
Регистрация: 14.03.2015
Сообщений: 11
18.11.2016, 19:38  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Если в конструкторе, так я показал в примере выше.
Я имею ввиду заполнение свойств в производных классах PassengerCar, Bus, Truck. Подскажите как реализовать запись такого вида:
C++ (Qt)
1
std::make_unique<Bus>("Автобус", 42) // "Автобус" сохраняется в свойстве класса Bus, а 42 в m_enginePower
?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.11.2016, 19:48
Если единственное поле, которое нужно добавить - название, то логично поместить его в базовый класс и инициализировать в конструкторе базового класса.
Если же речь идет о уникальных для производных классов полях, то тогда нужно убрать строчки типа using Car::Car; и во всех классах определить свои конструкторы. Передачу полей в unique_pointer вы написали верно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2016, 19:48
Помогаю со студенческими работами здесь

наследование классов
Помогите пожалуйста разобраться с задачей Создайте базу данных деканата. В ней фиксируются данные о 2 категориях студентах: студенты...

Наследование классов
Помогите, пожалуйста, разобраться - необходимо написать класс Administrator, кот наследуется (is derived) из класса SalariedEmployee: ...

наследование классов
Работаю в с++ билдер.. программа вылетает при запуске.. после того, как сделал наследование.. В чем проблема? Как решить? Вот код: ...

Наследование классов
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; const int LEN=80; class kraina { private: ...

наследование классов
Помогите, пожалуйста. как соотносяться между собой размеры экземпляров базового и производного классов


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru