0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
1

Вывод объектов различных типов

30.01.2018, 12:39. Показов 407. Ответов 10
Метки нет (Все метки)

Есть класс родитель Object, от которого создаются другие различие классы. Мне нужно создать и вывести список этих объектов и их характеристики, но характеристики у всех разные. Например класс Book должен возвращать максимальное число страниц, а класс Car марку автомобиля и т.д. Можно ли это как то реализовать?
Пример абстрактного кода:
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
class Object
{
    // Члены и методы класса
}
 
class Book : public Object
{
    // Члены и методы класса
}
 
class Car : public Object
{
    // Члены и методы класса
}
 
int main()
{
    std::vector<Object*> vecObjects;
 
    for(int i = 0; i < 10; i++)
    {
         Book* object = new Book();
         vecObjects.push_back(object);
    }
 
    for(size_t i = 0; i < m_vecObjects.size(); i++)
         if(vecObjects[i]->getType() == Type_Book)
              std::cout << vecObjects[i]->getMaxPage();
  
    return 0;
}
В таком случае возникает ошибка что у родительского члена нет такого метода. Я понимаю эту ошибку, но не могу понять как вывести список, состоящий из объектов различных типов. Может кто-нибудь подсказать решение данной задачки? Или какой-нибудь, в котором искать ответ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2018, 12:39
Ответы с готовыми решениями:

Объявление переменных различных типов
Совсем не понимаю задачу Помогите пожалуйста!!...

Ввод данных различных типов.
Ввод данных. Читаю книжку по плюсам. Застопорился на моменте с вводом данных, когда строки, числа и...

Возвращение различных типов данных
Привет. Есть необходимость реализации обработки различных типов данных. Имеются 3 различных...

Массив из массивов различных типов (malloc)
На сколько я знаю, объявление двумерного массива (интов) выглядит так: int** myArr =...

10
1363 / 1000 / 316
Регистрация: 28.07.2012
Сообщений: 2,769
30.01.2018, 12:45 2
Цитата Сообщение от stre_l0k Посмотреть сообщение
Может кто-нибудь подсказать решение данной задачки?
Полиморфизм, приведение типов, dynamic_cast. Ищи ответ в этих направлениях.
0
║XLR8║
1211 / 908 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
30.01.2018, 16:03 3
stre_l0k, как и сказал nonedark2008, нужно создать абстрактный класс и определить в нем нужный метов, а в наследнике выполнить реализацию.

Литература:
- https://www.ibm.com/support/kn... plr142.htm
- http://en.cppreference.com/w/c... ract_class
- гугл по форуму "site:cyberforum.ru абстрактный класс"

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
#include <iostream>
#include <string>
#include <vector>
 
class Animal {
  public:
    virtual std::string voice() const = 0;
};
 
class Cat : public Animal {
  public:
    std::string voice() const { return "Meow"; }
};
 
class Dog : public Animal {
  public:
    std::string voice() const { return "Gaph"; }
};
 
int main() {
    std::vector<Animal*> v;
    v.push_back(new Cat());
    v.push_back(new Dog());
    for (const Animal* animal: v) {
        std::cout << animal->voice() << std::endl;
    }
}
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
30.01.2018, 16:55  [ТС] 4
Цитата Сообщение от outoftime Посмотреть сообщение
stre_l0k, как и сказал nonedark2008, нужно создать абстрактный класс и определить в нем нужный метов, а в наследнике выполнить реализацию.
в примере вы привели два производных класса у которых один и тот же метод, наследуемый от класса родителя, это не совсем то, что я описал, мне нужно в одном векторе собрать несколько объектов разных типов, но произошедших от одного родительского класса и вывести их характеристики. Выводимые характеристики у объекта Книга и у объекта Машина будут разными (это просто к примеру). По совету nonedark2008 читаю про полиморфизм и привидение классов.
0
║XLR8║
1211 / 908 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
31.01.2018, 00:15 5
stre_l0k, под характеристиками можно много чего иметь в виду. Пример можно? Побольше конкретики.

Добавлено через 7 часов 7 минут
stre_l0k, https://www.youtube.com/watch?v=e_g65LUXpBI вот посмотри, может тебе концепты надо...
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
31.01.2018, 01:51  [ТС] 6
Цитата Сообщение от outoftime Посмотреть сообщение
stre_l0k, под характеристиками можно много чего иметь в виду. Пример можно? Побольше конкретики.
Цитата Сообщение от stre_l0k Посмотреть сообщение
Мне нужно создать и вывести список этих объектов и их характеристики, но характеристики у всех разные. Например класс Book должен возвращать максимальное число страниц, а класс Car марку автомобиля и т.д.
Дело в том, что у каждого объекта разный тип, поэтому необходимо вызывать разные методы для разных классов, например у книги getMaxPage(), а у автомобиля getMaxSpeed(), вот такой утрированный пример.

Добавлено через 13 минут
Или другой пример пример - инвентарь в играх: как например в нем происходит вывод содержимого рюкзака/сумки/т.д. ? Там же совсем разные типы обектов находятся, так как же происходит их пеоечисдение с краткими характеристиками?
0
║XLR8║
1211 / 908 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
31.01.2018, 02:03 7
Цитата Сообщение от stre_l0k Посмотреть сообщение
Дело в том, что у каждого объекта разный тип, поэтому необходимо вызывать разные методы для разных классов, например у книги getMaxPage(), а у автомобиля getMaxSpeed()
Неужто прям так необходимо?

Цитата Сообщение от stre_l0k Посмотреть сообщение
Или другой пример пример - инвентарь в играх: как например в нем происходит вывод содержимого рюкзака/сумки/т.д. ? Там же совсем разные типы обектов находятся, так как же происходит их пеоечисдение с краткими характеристиками?
Ну как-бы нет. Там колекция которая отвечает определенным концептам я давал ссылку выше. Можете поискать инфу на русском языке. Т.е. не смотря на то что объекты разные у них общий интерфейс и рюкзаку пох что у него внутри. Он скзал дай мне свой вес и картинку которую мне отображать а больше его ничего не волнует. И по**й кто ты, хоть ящерица, хоть папа римский, если ты не можешь дать ответ на вопросы которые задает рюкзак - не лезь туда.

Не по теме:

Ёба**й ... вот это бред. Люди учите мат часть!

0
Don't worry, be happy
17268 / 10139 / 1963
Регистрация: 27.09.2012
Сообщений: 25,364
Записей в блоге: 1
31.01.2018, 04:22 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Animal {
public:
    virtual void write_to_stream(std::ostream & stream) const noexcept { /*выводишь в поток что тебе надо*/ }
};
 
class Cat : public Animal {
public:
    void write_to_stream(std::ostream & stream) const noexcept override{ /*выводишь в поток что тебе надо*/ }
};
 
class Dog : public Animal {
public:
    void write_to_stream(std::ostream & stream) const noexcept override{ /*выводишь в поток что тебе надо*/ }
};
 
int main() {
    std::vector<Animal*> v;
    v.push_back(new Cat());
    v.push_back(new Dog());
    for (const Animal* animal: v) {
        animal->write_to_stream(std::cout);
    }
}
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
31.01.2018, 05:12 9
Вам это поможет.
http://cpp-reference.ru/patter... s/adapter/
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
31.01.2018, 14:18  [ТС] 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
class Object
{
    // Члены и методы класса
}
 
class Book : public Object
{
    // Члены и методы класса
}
 
class Car : public Object
{
    // Члены и методы класса
}
 
int main()
{
    std::vector<Object*> vecObjects;
 
    for(int i = 0; i < 10; i++)
    {
         Book* object = new Book();
         vecObjects.push_back(object);
    }
 
    for(size_t i = 0; i < m_vecObjects.size(); i++)
         if(vecObjects[i]->getType() == Type_Book)
              std::cout << ((Book*)vecObjects[i])->getMaxPage();
  
    return 0;
}
Таким способом все работает и компилятор не выдает ошибки
0
1363 / 1000 / 316
Регистрация: 28.07.2012
Сообщений: 2,769
31.01.2018, 16:10 11
Цитата Сообщение от stre_l0k Посмотреть сообщение
Таким способом все работает и компилятор не выдает ошибки
Ты воспользовался приведением типов из Си. В Си++ предпочтительнее (и безопаснее) использовать dynamic_cast.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2018, 16:10

Инстанцирование шаблона для различных типов
Помогите пожалуйста с программой... Нужно создать шаблон класса, для работы со структурой...

Ввод значений переменных различных типов
Всем доброго вечера. возникла проблемка с одним задание: Ввод значений переменных различных...

Представления различных типов данных в памяти компьютера
Такие данные на входе : 1. enum color { BLUE = 2, GREEN = BLUE + 8, CYAN,...

Ускорить программу ответа на запросы различных типов
Дан одномерный целочисленный массив A длины N. Пусть нумерация элементов в массиве начинается с 1 и...

Класс динамического массива для различных типов
Можно ли создать класс динамического массива, чтоб при создании массива можно было бы задать размер...

Щаблон для различных типов одномерных массивов
Общая постановка. Даны: число N и последовательность a1, a2, … aN. Создать шаблон класса,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru