6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
1

Как определить, к какому классу относится элемент массива?

03.10.2015, 22:00. Показов 3220. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Задача следующая: существует абстрактный класс, который наследуется в нескольких производных классах. После этого, переменная-указатель в базовом абстрактном классе используется для создания списка. До этого момента всё хорошо, есть список из элементов. Требуется обратиться к элементам списка, принадлежащим одному из классов. Как это сделать? Т.е., может, можно как-то проверить каждый элемент на принадлежность к какому-либо заданному классу?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2015, 22:00
Ответы с готовыми решениями:

К какому классу относится PC
Подскажите пожалуйста, к какому классу относится десктопный комп., к Мини - ЭВМ или к микро - ЭВМ?

Как определить к какому Treenode относится контекстное меню
у меня есть TreeView. Во время выполнения программы туда добавляются treenode которым присваивается...

Как определить к какому классу принадлежит переданный объект ?
например есть классы и метод передающий класс, который наследовался от другого класса. Как узнать...

Как определить, к какому типу данных (integer, real, string, char и т.д) относится число или слово
Всем привет! Такой вопрос. Пользователь вводит с клавиатуры значение переменной с помощью...

11
81 / 25 / 19
Регистрация: 27.10.2014
Сообщений: 420
03.10.2015, 22:04 2
dynamic_cast если не ошибаюсь присваивает с проверкой
1
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
03.10.2015, 22:12  [ТС] 3
Не совсем понятно его использование. Как потом тогда получить тип элемента?
0
81 / 25 / 19
Регистрация: 27.10.2014
Сообщений: 420
03.10.2015, 22:21 4
Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
Не совсем понятно его использование. Как потом тогда получить тип элемента?
Он работает только с ссылками и указателями. В случае неправильного приведения типов для ссылок вызывается исключительная ситуация std::bad_cast, а для указателей будет возвращен 0. То есть проверяешь, и в случае с указателем ставишь проверку еще.
Приведи код задачи
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.10.2015, 23:09 5
Код будет?
0
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
03.10.2015, 23:33  [ТС] 6
Не думал, что он понадобится, поэтому и опустил его. Держите В список добавляются по 2 объекта классов cartoon и advertising, затем, предположим, нужно определить в списке, какие элементы имеют тип cartoon, например...



main.cpp:

C++
1
2
3
4
5
6
7
8
9
    tv* tvVar = new tv("TV Program", "28.09.2015");
 
    cartoon* firstCartoon = new cartoon("CARTOON! Spanch Bob", "09:30");
    cartoon* secondCartoon = new cartoon("CARTOON! Goofy", "10:00");
 
    advertising* firstAdvertising = new advertising("ADVERTISING! Awesome knight! Only 9.99$", "10:50   10 min left!");
    advertising* secondAdvertising = new advertising("ADVERTISING! Awesome knight! Now  7.49$", "10:55   5 min left!");
 
    tvVar->addElements(4, firstCartoon, secondCartoon, firstAdvertising, secondAdvertising);


base.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
#include "stdafx.h"
#include "base.h"
 
base::base()
{
    this->name_ = NULL;
    this->time_ = NULL;
    this->head = NULL;
    this->next = NULL;
}
 
base::base(char* name, char* time)
{
    this->name_ = name;
    this->time_ = time;
    this->other_ = NULL;
}
 
base::base(char* name, char* time, char* other)
{
    this->name_ = name;
    this->time_ = time;
    this->other_ = other;
}
 
void base::setNext(base* newNext)
{
    this->next = newNext;
};
 
void base::setCurrent(base* curr)
{
    this->name_ = curr->name_;
    this->time_ = curr->time_;
    this->other_ = curr->other_;
};
 
void base::show()
{
    base* temp = head;
 
    while (temp != NULL)
    {
        std::cout << temp->getTime() << '\t' << temp->getName();
        if (temp->getOther() != NULL) std::cout << '\t' << temp->getOther();
        std::cout << std::endl;
        temp = temp->next;
    };
};
 
base::~base()
{
    delete next;
    delete head;    
}


base.h:

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
#ifndef BASE_CHECK
#define  BASE_CHECK
 
#include <iostream>
 
class base
{
 
public:
    base();
    base(char* name, char* time);
    base(char* name, char* time, char* other);
    
    void setCurrent(base* curr);
    void setNext(base* next);
 
    virtual char* getTime() const = 0;
    virtual char* getName() const = 0;
    virtual char* getOther() const = 0;
 
    static void show();
 
    virtual ~base();
 
protected:
    static base* head;
    base* next;
 
    char* name_;
    char* time_;
    char* other_;
 
    friend class tv;
};
 
#endif


tv.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
#include "stdafx.h"
#include "tv.h"
 
base* base::head = NULL;
 
tv::tv() : base() {}
tv::tv(char* name, char* time)
{
    if (this->head == NULL)
    {
        this->head = this;
        this->name_ = name;
        this->time_ = time;
        this->other_ = NULL;
    }
    else
    {
        tv::addElement(this);
    };
}
 
char* tv::getTime() const
{
    return this->time_;
};
 
char* tv::getName() const
{
    return this->name_;
};
 
char* tv::getOther() const
{
    return this->other_;
};
 
void tv::setName(char* name)
{
    this->name_ = name;
};
 
void tv::setTime(char* time)
{
    this->time_ = time;
};
 
void tv::setOther(char* other)
{
    this->other_ = other;
};
 
void tv::addElement(base* element)
{
    base* temp = head;
 
    if (temp->head != NULL)
    {
        while (temp->next != NULL)
            temp = temp->next;
 
        temp->setNext(element);
        temp = temp->next;
        temp->next = NULL;
    };
};
 
void tv::addElements(int nElements, base* element, ...)
{
    base* temp = head;
 
    if (temp->head != NULL)
    {
        while (temp->next != NULL)
            temp = temp->next;
 
        for (int i = 0; i < nElements; i++)
        {
            temp->setNext(*(&element + i));
            temp = temp->next;
            temp->next = NULL;
        };
    };
};


tv.h:

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
#include "base.h"
#include <iostream>
 
class tv : public base
{
 
public:
    tv();
    tv(char* name, char* time);
 
    void setTime(char* time);
    void setName(char* name);
    void setOther(char* other);
 
    char* getTime() const;
    char* getName() const;
    char* getOther() const;
 
    void addElement(base* element);
    void addElements(int nElements, base* element, ...);
 
private:
    char* other_;
};


cartoon.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
#include "stdafx.h"
#include "cartoon.h"
 
cartoon::cartoon() : base() {}
cartoon::cartoon(char* name, char* time) : base(name, time) {}
 
char* cartoon::getTime() const
{
    return this->time_;
};
 
char* cartoon::getName() const
{
    return this->name_;
};
 
char* cartoon::getOther() const
{
    return this->other_;
};
 
void cartoon::setTime(char* time)
{
    this->time_ = time;
};
 
void cartoon::setName(char* name)
{
    this->name_ = name;
};
 
void cartoon::setOther(char* other)
{
    this->other_ = other;
};


cartoon.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "base.h"
 
class cartoon : public base
{
 
public:
    cartoon();
    cartoon(char* name, char* time);
 
    void setTime(char* time);
    void setName(char* name);
    void setOther(char* other);
 
    char* getTime() const;
    char* getName() const;
    char* getOther() const;
};


advertising.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
#include "stdafx.h"
#include "advertising.h"
 
advertising::advertising() : base() {}
advertising::advertising(char* name, char* time) : base(name, time) {}
 
char* advertising::getTime() const
{
    return this->time_;
}
 
char* advertising::getName() const
{
    return this->name_;
};
 
char* advertising::getOther() const
{
    return this->other_;
};
 
void advertising::setName(char* name)
{
    this->name_ = name;
};
 
void advertising::setTime(char* time)
{
    this->time_ = time;
};
 
void advertising::setOther(char* other)
{
    this->other_ = other;
};


advertising.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "base.h"
 
class advertising : public base
{
 
public:
    advertising::advertising();
    advertising::advertising(char* name, char* time);
 
    void setName(char* name);
    void setTime(char* time);
    void setOther(char* other);
 
    char* getTime() const;
    char* getName() const;
    char* getOther() const;
};
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.10.2015, 00:03 7
1) Вы не заметили что некоторый код повторяется? хм.
2) Почему не использовали контейнер STL ?
3) Для метода с неопределённым количеством параметров используйте это http://www.cplusplus.com/refer... /va_start/
4) protected поля в вашем случае нарушение инкапсуляции
5) имя base не несёт никакой смысловой нагрузки.
6) уточнение пространства имён в описание класса advertising::advertising(); излишние
1
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
04.10.2015, 00:13  [ТС] 8
rikimaru2013, можно про пункт 4 подробнее? Имеется ввиду protected в base? Не обойтись ведь исключительно с private, во всяком случае, с моими нынешними знаниями.
Про пункт 5: хм, а как бы Вы предложили назвать базовый абстрактный класс в данном случае?
Пункт 6: точно, не заметил, благодарю.

Спасибо Вам за конструктивную критику Это попытка реализации задания лабораторной работы. Тем не менее, вопрос всё ещё актуален: как определить, к какому типу принадлежит элемент списка?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.10.2015, 00:16 9
Какое задание?
0
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
04.10.2015, 00:38  [ТС] 10
Определить управляющий класс Контроллер, который управляет объектом- Сущностью и реализовать в нем запросы по варианту:
Создать Программу передач. Найти все фильмы, снятые в определенный год, подсчитать продолжительность программы по времени, число рекламных роликов.

Есть ещё несколько классов, для примера скинул cartoon и advertising. Так и получается, что, например, число рекламных роликов(advertising) из всего списка подсчитать нужно. В этом и загвоздка.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.10.2015, 01:10 11
Лучший ответ Сообщение было отмечено Minchanin-Bel как решение

Решение

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <iostream>
#include <string>
#include <list>
using namespace std;
 
struct Time
{
    int                                 m_hour;
    int                                 m_minutes;
    int                                 m_seconds;
};
struct Date
{
    int                                 m_year;
    int                                 m_mounth;
    int                                 m_day;
    Time                                m_time;
};
float operator-(const Date& left, const Date& right)
{
    return 1; // i'm to lazy
}
struct ProgramElementsInfo
{
    std::string                         m_name;
    Date                                m_startTime;
    Date                                m_finishTime;
};
enum class ProgramElementType
{
    NONE,
 
    CARTOON,
    MOVIE,
    ADVERISING,
};
class ProgramElements
{
private:
    ProgramElementsInfo                 m_info;
    ProgramElementType                  m_type;
 
protected:
    void                                setType(ProgramElementType type)
    {
        m_type = type;
    }
public:
    ProgramElements(ProgramElementsInfo info)
    {
        m_info = info;
    }
    virtual void                        run() = 0; // pure virtual
 
    float                               getElementDuration() const
    {
        return m_info.m_finishTime - m_info.m_startTime;
    }
    std::string                         getElementName() const
    {
        return m_info.m_name;
    }
    ProgramElementType                  getType() const
    {
        return m_type;
    }
    
};
 
class Cartoon : public ProgramElements  
{
    typedef ProgramElements Parent;
private:
    int                                 m_productionYear;
public:
    Cartoon(ProgramElementsInfo info, int age) :
        Parent(info)
    {
        setType(ProgramElementType::CARTOON);
    }
    int                                 getProductionYear() const
    {
        return m_productionYear;
    }
    virtual void                        run() override
    {
 
    }
};
enum class AdvertisingClass
{
    A,
    B,
    C
};
class Advertising : public ProgramElements
{
    typedef ProgramElements Parent;
public:
    Advertising(ProgramElementsInfo info, AdvertisingClass advClass) :
        Parent(info)
    {
        setType(ProgramElementType::ADVERISING);
    }
    virtual void                        run() override
    {
 
    }
};
class Program
{
private:
    std::list<ProgramElements*>         m_list;
 
public:
    void                                addProgramElement(ProgramElements* pointer)
    {
        m_list.push_back(pointer);
    }
    float                               getDuration() // подсчитать продолжительность программы по времени
    {
        float result = 0.0f;
        for(std::list<ProgramElements*>::iterator it = m_list.begin(); it != m_list.end(); ++it)
        {
            result += (*it)->getElementDuration();
        }
        return result;
    }
    int                                 getAdvertisingCount() // число рекламных роликов
    {
        int result = 0;
        for(std::list<ProgramElements*>::iterator it = m_list.begin(); it != m_list.end(); ++it)
        {
            if((*it)->getType() == ProgramElementType::ADVERISING)
            {
                result++;
            }
        }
        return result;
    }
    std::list<Cartoon*>                 getCartoonProductedIn(const int year)
    {
        std::list<Cartoon*> list;
 
        for(std::list<ProgramElements*>::iterator it = m_list.begin(); it != m_list.end(); ++it)
        {
            if((*it)->getType() == ProgramElementType::CARTOON)
            {
                Cartoon* ptr = dynamic_cast<Cartoon*>(*it);
                if(ptr->getProductionYear() == year)
                {
                    list.push_back(ptr);
                }
            }
        }
 
        return list;
    }
};
1
6 / 6 / 3
Регистрация: 19.09.2010
Сообщений: 173
04.10.2015, 12:30  [ТС] 12
Спасибо Вам
0
04.10.2015, 12:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2015, 12:30
Помогаю со студенческими работами здесь

Как из общего списка получить элементы одного класса? или как определить к какому классу принадлежит объект?
суть вопроса: Есть матрица. в ней хранятся ссылки на элементы класса и его наследников (в этом...

Определить какому сервису относится E-Mail (строка)
string parrent = @&quot;^\w+@mail.&quot;; Regex regex = new Regex(parrent); ...

Определить по введенной дате, к какому знаку цветка он относится
Здравствуйте дорогие пользователи . Помогите с заданием по VBA : Составить программу, в которой...

Определить, к какому листу относится та или иная ячейка
Здравствуйте. Не могу понять, как устроена работа с листами в excel. Насколько я знаю, объект range...


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

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

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