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

Достать нужный объект из контейнера - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не инициализированные указатели http://www.cyberforum.ru/cpp-beginners/thread1191007.html
Добрый день, пишу небольшую игру на движке, появилась проблема main.cpp #include “mainClass.h” int main() { bool endless = true; mainClass mainObject; mainObject.initialize();
C++ Слушание udp порта Создаем сервер udp, слушаем порт, как можно сделать так чтобы пока я обрабатываю 1 полученный пакет, все остальные в очереди стоят, чтобы не посеять их? http://www.cyberforum.ru/cpp-beginners/thread1190970.html
Разработать класс Итератор, методы которого: переход в начало списка, в конец, к текущему элементу списка, к с C++
Разработать класс Итератор, методы которого: переход в начало списка, в конец, к текущему элементу списка, к следующему элементу, к предыдущему.
C++ Определить номера строк матрицы, содержащих хотя бы одно заданное значение, и умножить их на другое
1. Определить номера строк матрицы R, хотя бы один элемент которых равен с, и элементы этих строк умножить на d.
C++ Функция удаления строки из файла http://www.cyberforum.ru/cpp-beginners/thread1190942.html
Мной написана такая функция. В ней две проблемы: 1) после поиска выводится не найденное, а все, что записано 2) после удаления строки появляется строка нулей (в конце нового файла). как это решить? :-| void remove (){ //удаление struct recipe *list; int k=0; int n=0; char c; int i; FILE *fa; fa=fopen("list.txt", "r"); if (!fa){
C++ Программа вычисления простой формулы Доброе утро, подскажите, решение. Нам ничего не объяснили, методичек не дали, сказали "загуглите". Все, что смог загуглить, видно в коде ниже. Но как видно - не сработало. \frac{\sqrt{cos(\alpha)+sin(\beta)}}{a^3+b^2-c^3} #include <iostream> #include <cmath> int main() { double a, b, c, alpha, beta; подробнее

Показать сообщение отдельно
Skaarj
2 / 2 / 1
Регистрация: 28.06.2013
Сообщений: 53

Достать нужный объект из контейнера - C++

28.05.2014, 11:05. Просмотров 289. Ответов 9
Метки (Все метки)

Возник вопрос, отчасти я сам решил(получил нужный результат), но очень коряво.

Мне нужно достать нужный объект из контейнера на абстрактный класс в методах классов наследниках. Если вкратце, то у меня есть контейнер указателей на абстрактный класс, в котором хранятся различные объекты классов наследников, в моём случае это класс "Метеорит" и "Лазер", со временем будут ещё. Хотелось бы реализовать взаимодействие между ними как то так

C++
1
2
3
4
5
6
7
8
9
extern std::vector<CObject*> Objects;
 
    for(int i = 0; i < (int)Objects.size(); i++)
    {
        for(int j = 0; j < (int)Objects.size(); j++)
        {
            Objects[i]->Collision(Objects[j]);
        }
    }
То есть в зависимости от того какой объект в качестве аргумента передаётся, то и происходит с объектами.

Сейчас у меня как ни странно всё работает - пока видов объектов всего 2.
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
// абстрактный класс
class CObject
{
virtual void Collision(CObject* Object) = 0;
}
// класс наследник
class CLaser : public CObject
{
friend class CMeteor;
    void Collision(CObject* Object);
    bool Collision(CMeteor* Meteor); 
}
 
class CMeteor : public CObject
{
 
}
// Объявления методов CLaser
void CLaser::Collision(CObject* Object)
{
    CMeteor* Meteor;
    Meteor = (CMeteor*)Object;        
 
    if(Collision(Meteor) == true)
        Object->DestroyObject();
 
}
 
bool CLaser::Collision(CMeteor* Meteor)
{
    if(LaserHit(Meteor->Matrix, Meteor->MeteorSpeed, Meteor->MeteorRadius) == true)
        return true;
    else return false;
}

Meteor = (CMeteor*)Object;
Насколько законное такое присваивание типа? Что будет с объектами из контейнера, которые не CMeteor типа? И можно ли каким то образом проверить какой объект какого типа мы получаем в качестве аргумента, чтобы не лепить такие грабли? Чтобы сложность проверки была линейная - N Объектов - N проверок, а не увеличивалась от количества типов содержащихся в контейнере.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru