Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

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

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

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

... Поинтор сейчас поинтит ???


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

так вот... как мне вернуть инфу на какого ребенка сейчас отцовский поитер направлен
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 20:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть ли элемент который возвращает инфу на какой элемент иерархии (C++):

Написать программу:функция что возвращает элемент массива,и удаляет этот элемент з массива - C++
Написать программу:функция что возвращает элемент массива,и удаляет этот элемент з массива помогите написать!!

Какой элемент останется в кольце последним, если начать по очереди удалять из списка каждый n элемент - C++
Создать структуру с именем Subject с полями: фамилия, имя. Сформиро-вать замкнутое кольцо (односвязный список, у которого последний...

Найти нулевой(ые) элемент(ы) в матрице, вывести на пересечение какой строки и столбца располагается(ются) этот(эти) элемент(ы) - C++
Ребят, программа нужна срочно, мне на неё нужно много потратить времени, помогите. Язык Си.

Найти самый наименьший элемент в матрице, и найти сумму столбца который стоит этот наименьший найденный элемент - C++
Найти самый наименьший элемент в матрице, и найти сумму столбца который стоит этот наименьший найденный элемент Помогите ребята нужна ваша...

Вывести содержимое списка в следующем порядке: первый элемент, последний элемент, второй элемент, предпоследни - C++
#include <iostream> #include <list> #include <iterator> void output(std::list<int> myList, std::list<int>::iterator iter1,...

Строки. Как найти в слове первый элемент? Второй элемент, последний элемент? - C++
как найти в слове первый элемент?Второй элемент,последний элемент.С помощью каких операторов это делается??

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 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
Leeto
7 / 7 / 0
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2012, 23:00 #4
Ага. Такую функцию.

> и как это пересобачить под пойнтер ???
Можно привести пример желаемого кода, который бы решал нужную задачу, который бы вы написали, если бы оно всё "пересобачилось"?
1
Leeto
7 / 7 / 0
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2012, 23:43 #6
Эм, и что эта программа должна выводить? 12*32 и 2322*444? Так она вроде это и сейчас делает.
0
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 23:50  [ТС] #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Эм, и что эта программа должна выводить? 12*32 и 2322*444? Так она вроде это и сейчас делает.
так нет вопрос в том как сделать так чтоб она еще и выводила на какой класс папа сейчас поинтит
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2012, 23:53 #8
Ну вон же решение с виртуальной функцией. Каждому дочернему классу делаете свою специализацию. Нормальной рефлексии нет, так что так.
0
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 23:55  [ТС] #9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ну вон же решение с виртуальной функцией. Каждому дочернему классу делаете свою специализацию. Нормальной рефлексии нет, так что так.



а я думал у тебя / вас мысля пришла... поэтому код запросил(и)
0
MrCold
855 / 753 / 71
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
02.09.2012, 00:13 #11
MrCold, И где тут инфа о типе?)
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.09.2012, 09:02 #12
Цитата Сообщение от Leeto Посмотреть сообщение
так вот... как мне вернуть инфу на какого ребенка сейчас отцовский поитер направлен
Подозреваю, что дело всё таки в ошибочной архитектуре и/или скудном интерфейсе базового класса.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
02.09.2012, 09:25 #13
в MFC это реализовано при помощи виртуальной функции GetRuntimeClass
которая возвращает структуру, в коей написано имя класса, размер, кто родитель и т.д
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
http://www.firststeps.ru/mfc/steps/help/r.php?638
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 09:25
Привет! Вот еще темы с ответами:

Функция .end() возвращает не тот элемент - C++
#include &lt;iostream&gt; #include &lt;list&gt; #include &lt;fstream&gt; #include &lt;iterator&gt; #include &lt;fstream&gt; void printVec(std::list&lt;char&gt;...

Элемент-функция length() возвращает количество символов - C++
Здравствуйте. void GradeBook::setCourseName(string name) { if (name.length() &lt;= 25) // если не более 25 символов ...

Функция возвращает весь вектор или элемент? - C++
Например есть такая функция vector&lt;int&gt; huh(...,...); Функция возвращает весь вектор или элемент? А есть тут раздел,...

Функция изымает элемент из стека и возвращает его значение - C++
Нужно реализовать стек , в котором вместо двух функций top i pop используется только одна функция pop , которая делает эти два действия...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.09.2012, 09:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru