Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2

Идентификация типов объектов

27.01.2023, 13:35. Показов 1321. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
допустим в контейнере разные потомки одного предка, как их можно идентифицировать, что бы например удалить или копировать только определенного типа? блгдарствую
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.01.2023, 13:35
Ответы с готовыми решениями:

как устроена динамическая идентификация типов
Здрасте! Меня интересует, как компилируемая программа может проводить RTTI , если во время компиляции типы данных еще не известны.

Идентификация объектов
1 Идентификация объектов В приведенных ниже задачах необходимо составить программу идентификации геометрической фигуры по ее элементам....

Как отсортирвоать контейнер, если его тип определяется по ходу выполнения программы? (динамическая идентификация типов)
собсно #include <windows.h> #include <stdio.h> #include <vector> #include <list> #include <algorithm> #include <cxxabi.h> ...

23
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2919 / 1046
Регистрация: 01.06.2021
Сообщений: 10,807
27.01.2023, 13:49
qppq, может typeid(...).name() ?

Добавлено через 3 минуты
Кстати, в инете есть такой шаблон:

C++
1
2
3
4
template<typename Base, typename T>
inline bool instanceof(const T *ptr) {
   return dynamic_cast<const Base*>(ptr) != nullptr;
}
И потом проверяй с помощью instanceof()
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
27.01.2023, 15:56
qppq, по-хорошему, такого быть не должно.
Строится общий интерфейс максимально абстрактный и ничего не говорящий о типе потомка.
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class IteratedPart {
  public:
    virtual int getStatus() = 0;
};
class player:public IteratedPart {
  public:
    virtual int getStatus() {
       if (health>0) return 1;
       else return -1;
    }
};
 
//в коде
foreach(IteratedPart* part: container) {
  if (part->getStatus() != -1) {
      next_container->insert(part);
  }
}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.01.2023, 16:19
Цитата Сообщение от qppq Посмотреть сообщение
допустим в контейнере разные потомки одного предка
Сегодня, такого ещё нет. Могут быть только указатели на базовый класс. Если вам, действительно нужно определять динамический тип используйте RTTI Такой ход мысли говорит о плохом дизайне, как правило, поскольку дорог с точки зрения скорости.
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
27.01.2023, 18:51  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Могут быть только указатели на базовый класс
C++
1
2
3
4
5
vector <TParent *> Vec;
 
Vec.push_back(new T1());
Vec.push_back(new T2());
Vec.push_back(new T3());
указатели вродьбы

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
(health>0)
не понял что это
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
27.01.2023, 19:04
Цитата Сообщение от qppq Посмотреть сообщение
не понял что это
пример того, где должна находиться логика заполнения контейнера.
Мы взяли какой-то производный класс и всю логику, определяющую нужно или не нужно
Цитата Сообщение от qppq Посмотреть сообщение
что бы например удалить или копировать только определенного типа?
вынесли в самого последнего в иерархии классов наследника.
Если ты этого не понимаешь, возникает встречный вопрос - а какое условие копирования у тебя если не это? Напиши его и пусть оно будет внутри производного класса!


Ты же просил удалить все объекты производного класса игрок, которых не убили, так? Ну вот я и копирую! А Объекты класса скажем "дом" будут удалены как и игроки, у которых здоровье на нуле!
1
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
27.01.2023, 19:19  [ТС]
не так ты(а может я) видимо понял
допустим, контейнер заполнен указателями трех производных типов T1 T2 T3 от базового Parent, не важно в каком порядке,
нужно в другой контейнер скопировать указатели только одного типа (например Т2) из всех существующих в первом
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
27.01.2023, 19:24
Цитата Сообщение от Royal_X Посмотреть сообщение
может typeid(...).name() ?
При чем здесь name()? Просто typeid() решает эту задачу, если решать ее буквальной проверкой типа.
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
27.01.2023, 19:46  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
C++
1
2
3
4
template<typename Base, typename T>
inline bool instanceof(const T *ptr) {
   return dynamic_cast<const Base*>(ptr) != nullptr;
}

проверка приведения к указателю на базовый тип, а что дальше? нипонялникуйа
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
27.01.2023, 20:15
Цитата Сообщение от qppq Посмотреть сообщение
проверка приведения к указателю на базовый тип, а что дальше? нипонялникуйа
ну окей, вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class IteratedPart {
  public:
    virtual int getStatus() = 0;
};
class player:public IteratedPart {
  public:
    virtual int getStatus() {
       return 1;
    }
};
 
//в коде
foreach(IteratedPart* part: container) {
  if (part->getStatus() == 1) {
      next_container->insert(part);
  }
}
сильно влияет, что внутри функции что ли?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
27.01.2023, 20:17
Цитата Сообщение от qppq Посмотреть сообщение
проверка приведения к указателю на базовый тип, а что дальше? нипонялникуйа
Автор опечатался. Он явно имел в виду все наоборот

C++
1
2
3
4
5
template<typename T, typename Base>
inline bool instanceof(const Base *ptr) 
{
  return dynamic_cast<const T *>(ptr) != nullptr;
}
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
27.01.2023, 21:18  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
2
3
4
class player:public IteratedPart {
  public:
    virtual int getStatus() {
       return 1;
так в каждом типе свое значение возвращать можно, и сравнивать, так?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.01.2023, 21:21
qppq, Зачем сначала нужно было складывать все три объекта в один контейнер, а затем искать способы их разделить? Может быть сразу складывать в три разных контейнера?
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
27.01.2023, 21:37  [ТС]
2. Populate a container (e.g. vector or list) of objects of these types created in random manner with
random parameters.
....
4. Populate a second container that would contain only TypeA from the first container.

мож чего я не так понял
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.01.2023, 21:44
Цитата Сообщение от qppq Посмотреть сообщение
мож чего я не так понял
Да нет, все верно.
Но наверное стоило бы сразу написать, что это какое-то задание.
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
27.01.2023, 22:11  [ТС]
тест на знание азов), не тот азов

Добавлено через 22 минуты
в общем без шаблонов как на роликах, вот как надо было, учитесь сынки) шутка
C++
1
2
3
4
5
6
7
8
    vector <TParent *> Vec2;
    for(int i = 0; i < q; i++)
    {
       if (dynamic_cast<T1 *>(Vec1[i]) != nullptr)
    {
        Vec2.push_back(Vec1[i]);
    }
    }
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.01.2023, 22:26
Цитата Сообщение от qppq Посмотреть сообщение
вот как надо было
Ну здесь как минимум возможны варианты (перечислил ниже).

Цитата Сообщение от qppq Посмотреть сообщение
4. Populate a second container that would contain only TypeA from the first container.
1) Это может быть контейнер, который только хранит "представление" первого контейнера, но не владеет объектами
2) Это может быть контейнер с копиями объектов заданного типа
3) Это может быть контейнер которому передали владение объектами заданного типа из первого контейнера

В вашем варианте плохо то, что первый вариант от третьего не отличить совсем. Стоит подумать над этим.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
27.01.2023, 23:05
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сегодня, такого ещё нет.
У вас может и нет) А в с++ возможно с незапамятных времен))

Идиома rImpl - почти как pImpl, только данные аллоцируются не в куче, а во внутреннем буфере.
Обычный чаровый массив, немножечко выравнивания, и new placement.


https://onlinegdb.com/pgtKIMLXH


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
#include <cstddef>
#include <utility>
#include <type_traits>
 
// В реальном коде не забудьте про выравнивание
// И про защиту типа
template<size_t N = 32> struct any
{
    template<class t>  any(t&& a) 
    {
        new(buf) t(std::forward<t>(a));
    }
    
    template<class t, class... args>
    t& make(args&&... params)
    {
        auto* p = new(buf) t(std::forward<args>(params)...);
        return *p;
    }
    
    template<class t> operator t() noexcept
    {
        using x = std::remove_reference_t<t>;
        x* p = reinterpret_cast<x*>(this->buf);
        return *p;
    }
   
    char buf[N];
};
 
#include <iostream>
#include <vector>
#include <string>
 
struct IGPIGP
{
    template<class ostream> friend
    ostream& operator<<(ostream& out, const IGPIGP& obj)
    {
        out << "IGPIGP: " << obj.v;
        return out;
    }
    
    int v;
};
 
int main()
{
    std::vector< any<> > container
    {
        std::string{"hello"},
        IGPIGP{1},
        std::string{"world"},
        IGPIGP{2}
    };
    
    std::cout 
        << static_cast<std::string>(container[0]) << '\n'
        << static_cast<IGPIGP>(container[1])      << '\n'
        << static_cast<std::string>(container[2]) << '\n'
        << static_cast<IGPIGP>(container[3])      << '\n';
}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.01.2023, 00:56
Цитата Сообщение от eva2326 Посмотреть сообщение
У вас может и нет) А в с++ возможно с незапамятных времен))
Тут речь о другом. Вы говорите о хостинге на памяти. Тут нет ни чего о наследовании.
Сам подход известен. и достаточно сложен и с точки зрения типобезопасности и с точки зрения безопасности/нейтральности относительно исключений. eva2326, В стандартном С++ иерархии сохраняются как указатели на базовый класс. Тут студент страдает, а вы демонстрируете свою экстравагантную спину)
Цитата Сообщение от qppq Посмотреть сообщение
2. Populate a container (e.g. vector or list) of objects of these types created in random manner with
random parameters.
....
4. Populate a second container that would contain only TypeA from the first container.
qppq, тут ни где не сказано, что вам следует сначала создать суп, а потом вылавливать горошины. Можно создать суп и создавать параллельно варёный горошек. Когда вы обращаетесь конструктору (передаваемому оператору new) там есть информация о статическом типе, которая потом уходит на дно, где её нужно отлавливать при помощи RTTI (тут показали оба варианта - как), впоследствии. А лучше написать код который заселяет контейнеры так, чтобы потом не страдать. Впрочем, если цель задания познакомить вас с RTTI (болезненным образом), то тут ни куда не денешься.
А в задании этого нет, если не считать тот факт, что требуют делать последовательно. Можно сделать и с RTTI, но указать, что задание заставляет решать ущербную задачу.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
28.01.2023, 14:17
Цитата Сообщение от qppq Посмотреть сообщение
Идентификация типов объектов
Может это то что тебе нужно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2023, 14:17
Помогаю со студенческими работами здесь

Вывод объектов различных типов
Есть класс родитель Object, от которого создаются другие различие классы. Мне нужно создать и вывести список этих объектов и их...

Хранение объектов разных типов в контейнере
Добрый день. Требуется реализовать контейнер, который хранит объекты разных типов. Есть две мысли. 1. Воспользоваться полиморфизмом. Мы...

Вызов метода с одним именем у объектов разных типов
Здравствуйте. Подскажите как решить задачу. Есть 3 класса: A, B, C которые не связаны друг с другом и не наследуют от общего класса. В...

Простое создание строки из объектов разных типов данных
Всем доброго времени суток. Создал класс, который (по моему мнению) сделает более удобным создание строк и их передачу в функции,...

Как создать список для объектов разных типов данных
Здравствуйте, подскажите, пожалуйста, у меня есть задание: Создать базовый класс «Транспорт» и несколько производных от него классов :...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru