7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
1

Есть ли элемент который возвращает инфу на какой элемент иерархии

01.09.2012, 20:28. Показов 933. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
... Поинтор сейчас поинтит ???


Допустим есть Абстрактный папа
я делаю в мейне поинтор этого папы заряжаю его на какого ниб ребенка
и вызываю всякие там виртуальные функции которые переводятся на ребенка с которым я сейчас работаю через пойтор

так вот... как мне вернуть инфу на какого ребенка сейчас отцовский поитер направлен
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2012, 20:28
Ответы с готовыми решениями:

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

Необходлимо определить, есть ли в массиве мажорирующий элемент, и если есть, то какой
Мажорирующим элементом в массиве А будем называть элемент, встречающийся в массиве более n/2 раз....

Есть ли функция, которая возвращает пару: минимальный элемент и его номер в списке?
Существует ли "стандартная" функция, которая возвращает пару: минимальный элемент и его номер в...

Как удалить в векторе элемент, который есть структура?
vector<Admin> admins; for (int i = 0; i < admins.size(); i++) { Admin admin = admins; if...

12
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2012, 21:02 2
Лучший ответ Сообщение было отмечено как решение

Решение

Не по теме:

Что не пост, то лингвистическая загадка :) (No offense intended.)



Если знаете тип, то dynamic_cast<дочерний класс>, но это очевидно.

Если именно узнать динамический тип, то тут вас спасёт (?) через-жопу-работающая остальная часть RTTI: делаете typeid(дочерний объект), получаете на руки std::type_info. С type_info можно (нормально) делать только две вещи. Сравнивать с другим type_info, но только "равно — не равно", другого нет. И получить его имя в виде ASCIIZ-строки, но что там именно написано, определяется реализацией. Так что полагаться на него нельзя, это максимум чтоб вывести на экран.

В Си++ нет (встроенной) рефлексии. Если хочется — зафичьте отцовскому классу свою виртуальную функцию getType(), которая будет возвращать какой-нибудь enum с тегом типа, переопределите её в дочерних на нужный ChildType_n.

Но даже в таком варианте оно выглядит ужасно. Так что ещё лучше придумать какое-нибудь другое решение возникшей проблемы.
5
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 22:38  [ТС] 3
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение

Не по теме:

Что не пост, то лингвистическая загадка :) (No offense intended.)



Если знаете тип, то dynamic_cast<дочерний класс>, но это очевидно.

Если именно узнать динамический тип, то тут вас спасёт (?) через-жопу-работающая остальная часть RTTI: делаете typeid(дочерний объект), получаете на руки std::type_info. С type_info можно (нормально) делать только две вещи. Сравнивать с другим type_info, но только "равно — не равно", другого нет. И получить его имя в виде ASCIIZ-строки, но что там именно написано, определяется реализацией. Так что полагаться на него нельзя, это максимум чтоб вывести на экран.

В Си++ нет (встроенной) рефлексии. Если хочется — зафичьте отцовскому классу свою виртуальную функцию getType(), которая будет возвращать какой-нибудь enum с тегом типа, переопределите её в дочерних на нужный ChildType_n.

Но даже в таком варианте оно выглядит ужасно. Так что ещё лучше придумать какое-нибудь другое решение возникшей проблемы.

Короче тупо самому написать виртуальную функцию...
а ля
C++
1
2
void get_info(){
cout << "i'm childer 1 "; }

Не по теме:


))))) сорри )



ооо я у кого подсмотрел в свое время вот такой кусок...
C++
1
2
3
4
5
    const std::type_info &obj_type_info = ShapeType_Returner_withChoosenShape.type();   // Captures the type
            std::cout   << "\n\n The created figure type is an object of the "    // Calls its names and prints it
                        << obj_type_info.name() 
                        << "> "
                        << std::endl;
и как это пересобачить под пойнтер ??? в данном куске все дело спасает функция .type() (это функция от boost::variant )
кстати насколько я помню он что то даже адекватное возвращал а ля имя класса...
0
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2012, 23:00 4
Ага. Такую функцию.

> и как это пересобачить под пойнтер ???
Можно привести пример желаемого кода, который бы решал нужную задачу, который бы вы написали, если бы оно всё "пересобачилось"?
1
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 23:34  [ТС] 5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ага. Такую функцию.

> и как это пересобачить под пойнтер ???
Можно привести пример желаемого кода, который бы решал нужную задачу, который бы вы написали, если бы оно всё "пересобачилось"?

main.cpp
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
#include <iostream>
 
#include <sstream>
 
 
using namespace std; 
 
 
 
 
class base 
{
public   : 
    int x; 
    int y ; 
 
public : 
    
    base(){};
    base(int new_x, int new_y) : x(new_x), y (new_y){}; 
 
        virtual void  calc () = 0; 
            
            // cout << "\n if you see this line something wrong "; 
            
 
 
    friend std::ostream& operator << (std::ostream& out ,const  base& objA)
    {
        
        return  out  << "x: "<<  objA.x<< "y:" <<  objA.y; 
        
    }
 
 
};
 
 
class A : public base 
{
public   : 
    int x; 
    int y ; 
 
public : 
    
    A(){};
    A(int new_x, int new_y) : x(new_x), y (new_y){}; 
 
        void   calc ()
            {
            cout  <<"\n "<<   x*y; 
            }
 
 
    friend std::ostream& operator << (std::ostream& out ,const  A& objA)
    {
        
        return  out  << "x: "<<  objA.x<< "y:" <<  objA.y; 
        
    }
 
 
};
 
 
class B : public base 
{
public   : 
    int x; 
    int y ; 
 
public : 
    
    B(){};
    B(int new_x, int new_y) : x(new_x), y (new_y){}; 
 
         void  calc ()
            {
            cout <<"\n "<<   x*y*55; 
            }
 
    
    friend std::ostream& operator << (std::ostream& out ,const  B& objB)
    {
        
        return  out  << "x!!!: "<<  objB.x<< "y!!!:" <<  objB.y; 
        
    }
 
 
};
 
 
 
 
 
 
 
 
int main ()
 
{
    
 
    
 
    
    base * bb_father ;
 
    A aa(12,32); 
 
     B bb(2322,444); 
 
    bb_father = &aa; 
 
    cout << "\n from A ";
    bb_father->calc(); 
 
 
 
 
    bb_father = &bb;
    cout << "\n from B ";
    bb_father->calc(); 
    cout <<"\n "; 
    cout <<"\n "; 
    
return 0 ;
}


Не по теме:

подскажите плиз хот кейс для ребилд онли в MS VS 2010 rebuild hot keys = ctrl + alt + F7

0
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2012, 23:43 6
Эм, и что эта программа должна выводить? 12*32 и 2322*444? Так она вроде это и сейчас делает.
0
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 23:50  [ТС] 7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Эм, и что эта программа должна выводить? 12*32 и 2322*444? Так она вроде это и сейчас делает.
так нет вопрос в том как сделать так чтоб она еще и выводила на какой класс папа сейчас поинтит
0
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2012, 23:53 8
Ну вон же решение с виртуальной функцией. Каждому дочернему классу делаете свою специализацию. Нормальной рефлексии нет, так что так.
0
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 23:55  [ТС] 9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ну вон же решение с виртуальной функцией. Каждому дочернему классу делаете свою специализацию. Нормальной рефлексии нет, так что так.



а я думал у тебя / вас мысля пришла... поэтому код запросил(и)
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
02.09.2012, 00:11 10
Цитата Сообщение от Leeto Посмотреть сообщение
так вот... как мне вернуть инфу на какого ребенка сейчас отцовский поитер направлен

по индексу :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
    base * bb_father[ 2 ] ;
 
    bb_father[ 0 ] = new A( 12, 33);
    bb_father[ 1 ] = new B( 23,  44); 
  
 
    cout << "\n from A ";
    bb_father[ 0 ]->calc(); 
 
    cout << "\n from B ";
    bb_father[ 1 ] ->calc(); 
    cout <<"\n "; 
    cout <<"\n "; 
 
    delete  bb_father[ 0 ];
    delete  bb_father[ 1 ];
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.09.2012, 00:13 11
MrCold, И где тут инфа о типе?)
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.09.2012, 09:02 12
Цитата Сообщение от Leeto Посмотреть сообщение
так вот... как мне вернуть инфу на какого ребенка сейчас отцовский поитер направлен
Подозреваю, что дело всё таки в ошибочной архитектуре и/или скудном интерфейсе базового класса.
0
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
02.09.2012, 09:25 13
в MFC это реализовано при помощи виртуальной функции GetRuntimeClass
которая возвращает структуру, в коей написано имя класса, размер, кто родитель и т.д
http://msdn.microsoft.com/en-u... s.80).aspx
http://www.firststeps.ru/mfc/steps/help/r.php?638
0
02.09.2012, 09:25
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.09.2012, 09:25
Помогаю со студенческими работами здесь

Есть ли какой-то числовой элемент, обозначающий часовой пояс?
Т.е. есть ли какая-то функция, по типу: бла-бла.тайм.пояс.наш = &lt;вывести номер, гласящий, какое...

Есть ли в очереди хотя бы один элемент, который равен следующему за ним
Описать процедуру, которая определяет, есть ли в очереди хотя бы один элемент, который равен...

В массиве каждый элемент заменить на ближайший следующий за ним элемент, который больше его
Помогите выполнить лабу на с++ Само задание: В таблице А размера N за один просмотр необходимо...

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


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

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

Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru