144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
1

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

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

Author24 — интернет-сервис помощи студентам
допустим в контейнере разные потомки одного предка, как их можно идентифицировать, что бы например удалить или копировать только определенного типа? блгдарствую
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2023, 13:35
Ответы с готовыми решениями:

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

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

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

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

23
3249 / 1470 / 468
Регистрация: 01.06.2021
Сообщений: 4,965
27.01.2023, 13:49 2
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
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
27.01.2023, 15:56 3
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
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
27.01.2023, 16:19 4
Цитата Сообщение от qppq Посмотреть сообщение
допустим в контейнере разные потомки одного предка
Сегодня, такого ещё нет. Могут быть только указатели на базовый класс. Если вам, действительно нужно определять динамический тип используйте RTTI Такой ход мысли говорит о плохом дизайне, как правило, поскольку дорог с точки зрения скорости.
0
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
27.01.2023, 18:51  [ТС] 5
Цитата Сообщение от 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
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
27.01.2023, 19:04 6
Цитата Сообщение от qppq Посмотреть сообщение
не понял что это
пример того, где должна находиться логика заполнения контейнера.
Мы взяли какой-то производный класс и всю логику, определяющую нужно или не нужно
Цитата Сообщение от qppq Посмотреть сообщение
что бы например удалить или копировать только определенного типа?
вынесли в самого последнего в иерархии классов наследника.
Если ты этого не понимаешь, возникает встречный вопрос - а какое условие копирования у тебя если не это? Напиши его и пусть оно будет внутри производного класса!


Ты же просил удалить все объекты производного класса игрок, которых не убили, так? Ну вот я и копирую! А Объекты класса скажем "дом" будут удалены как и игроки, у которых здоровье на нуле!
1
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
27.01.2023, 19:19  [ТС] 7
не так ты(а может я) видимо понял
допустим, контейнер заполнен указателями трех производных типов T1 T2 T3 от базового Parent, не важно в каком порядке,
нужно в другой контейнер скопировать указатели только одного типа (например Т2) из всех существующих в первом
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
27.01.2023, 19:24 8
Цитата Сообщение от Royal_X Посмотреть сообщение
может typeid(...).name() ?
При чем здесь name()? Просто typeid() решает эту задачу, если решать ее буквальной проверкой типа.
0
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
27.01.2023, 19:46  [ТС] 9
Цитата Сообщение от 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
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
27.01.2023, 20:15 10
Цитата Сообщение от 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Эксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
27.01.2023, 20:17 11
Цитата Сообщение от 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
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
27.01.2023, 21:18  [ТС] 12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
2
3
4
class player:public IteratedPart {
  public:
    virtual int getStatus() {
       return 1;
так в каждом типе свое значение возвращать можно, и сравнивать, так?
0
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
27.01.2023, 21:21 13
qppq, Зачем сначала нужно было складывать все три объекта в один контейнер, а затем искать способы их разделить? Может быть сразу складывать в три разных контейнера?
0
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
27.01.2023, 21:37  [ТС] 14
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
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
27.01.2023, 21:44 15
Цитата Сообщение от qppq Посмотреть сообщение
мож чего я не так понял
Да нет, все верно.
Но наверное стоило бы сразу написать, что это какое-то задание.
0
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 775
27.01.2023, 22:11  [ТС] 16
тест на знание азов), не тот азов

Добавлено через 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
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
27.01.2023, 22:26 17
Цитата Сообщение от qppq Посмотреть сообщение
вот как надо было
Ну здесь как минимум возможны варианты (перечислил ниже).

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

В вашем варианте плохо то, что первый вариант от третьего не отличить совсем. Стоит подумать над этим.
0
1536 / 456 / 101
Регистрация: 17.05.2015
Сообщений: 1,424
27.01.2023, 23:05 18
Цитата Сообщение от 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
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.01.2023, 00:56 19
Цитата Сообщение от 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"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
28.01.2023, 14:17 20
Цитата Сообщение от qppq Посмотреть сообщение
Идентификация типов объектов
Может это то что тебе нужно
0
28.01.2023, 14:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2023, 14:17
Помогаю со студенческими работами здесь

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

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

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

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

Динамическое добавление объектов разных типов
Цель следующая, хочу сделать что-то вроде категорий (лейблы) и подкатегорий(чекбоксы). ...

идентификация объектов
идентификация равнобедренной трапеции по двум сторонам и углу между ними.определяемое...

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


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

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

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