1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 45
1

Посоветуйте паттерн для сверки всех объектов класса между собой

01.03.2016, 23:27. Показов 844. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья, нужен совет.

Есть потребность произвести сверку всех объектов класса между собой.
В зависимости от результатов, обработка.

Попробовал реализовать так:

допустим класс содержит структуру


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
struct Pos {
   int a,b,c;
   bool operator==(pos srt){
      retiurn this->a==srt.a&& . . . ? true : false;
   }  //перегрузим сверку для простоты   
}
 
class myClass{
 
Pos mySrt; // наша структурка (у каждого объекта своя :)  )
... // простые данные в стеке
... // аналогично
static map<int,myClass*> myMap //собственно сам контейнер, можно б было 
                  //взять и вектор, но думал в ключ что-то еще полезное вставить 
 
static int i=0; // каунтер, пока временно чисто для map<first
 
bool operator==(myClass obj){ // сверяем нужную нам структурку
                                       // но что б объект не находил самого себя
   return this != obj && this->mySrt == obj.mySrt ? true : false;}  
                                                // вообщето код компилился 
                                    //но все равно на первую проверку пропускал все.
 
public :
   myClass(){//в конструкторе
           ...    // инициализируем структуру
      myMap.at(this) = ++i;  // и наполняем map   
}
          // вот то что я хотел... извне при переборе всех объектов в (удобном месте)
void Compare(){               
   for(auto i : myMap)            // проганяется контейнер
      if(i.second == this ? true : false)  // попавшийся элемент выкидывает результат
         this->action()//  УРАА!! есть что обработать!! )))
}

как то так.
в коде могут быть ошибки (набирал быстро) но код откомпилился

Структура оказалась наполнена но даные не инициализиованы.(данне из стека видны не были, может в этом проблема?)
Пока реализовал сверку вне класа, все работает

Может по логике так не выйдет?
Псоветуйте где может быть ошибка либо какой то, другой паттерн.
Очень бы хотелось инкапсулировать сверку объектов и обработку внутри класса

Заранее спасибо.

Добавлено через 4 минуты
Прошу прощения, подсветка кода что-то
не то ловит, если не удобно читать могу снять теги кода.

Добавлено через 7 минут
тег кода должен быть [СРР] [/СРР] ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2016, 23:27
Ответы с готовыми решениями:

Работа с крупными файлами и ускорение их сверки между собой
Добрый ночи уважаемые форумчане. Столкнулся с такой проблемой: В наличии у меня есть...

Функционирование классов и объектов между собой
Доброго времени суток. Изучая учебник Дейтелов &quot;C++. How to Program&quot;, наткнулся на весьма несложное...

Метод класса изменяет переменную для всех объектов сразу
Программа по предмету исследование операций, на тему &quot;сетевое планирование управления&quot;. В общем,...

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

6
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
04.03.2016, 00:27 2
Цитата Сообщение от axedmin Посмотреть сообщение
тег кода должен быть [СРР] [/СРР] ?
Да. Вот про тэги.
1
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 45
04.03.2016, 01:10  [ТС] 3
Спасибо , буду знать, а то по привычкe [CODE]
А по "теме" можете что-то подсказать?
Был бы очень благодарен)))
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
04.03.2016, 01:31 4
axedmin, Я набрал ваш код за вас, и всё равно ничего не понял что вам надо.
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
#include <map>
 
struct Pos
{
    int a, b, c;
    bool operator==(const Pos& srt) const
    {
        return a == srt.a && b == srt.b && c == srt.c;
    }
};
 
class myClass
{
    Pos mySrt; // наша структурка (у каждого объекта своя :)  )
    static std::map<int, myClass*> myMap;
    static int i = 0;   // каунтер, пока временно чисто для map<first
 
 
public:
    bool operator==(const myClass& obj) const
    {
        return *this == obj && mySrt == obj.mySrt;
    }
    //но все равно на первую проверку пропускал все.
    
    myClass()
    {
        myMap[this] = ++i;
    }
 
// вот то что я хотел... извне при переборе всех объектов в (удобном месте)
    void Compare()
    {
        for (auto i : myMap)            // проганяется контейнер
        {
            if (i.second == this)     // попавшийся элемент выкидывает результат
            {
                this->action();
//              УРАА!! есть что обработать!! )))
            }
        }
    }
};
Так что вам надо?
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
04.03.2016, 05:20 5
Цитата Сообщение от Nosey Посмотреть сообщение
Так что вам надо?
Я так понял, у него есть функция
C++
1
2
3
4
5
6
7
8
9
10
11
void Compare()
    {
        for (auto i : myMap)            // проганяется контейнер
        {
            if (i.second == this)     // попавшийся элемент выкидывает результат
            {
                this->action();
//              УРАА!! есть что обработать!! )))
            }
        }
    }
Но логика мне говорит, что там должно быть
C++
1
2
i->action();
//              УРАА!! есть что обработать!! )))

Так же он перепутал местами ключ и значение

C++
1
2
3
4
 myClass()
    {
        myMap[this] = ++i;
    }
C++
1
2
3
4
 myClass()
    {
        myMap[++i] = this;
    }
Короче говоря, его объект вызывает метод Compare(), который в мапе перебирает все существующие объекты и если это обьект != текущий обьект, но вызывает у них какие то методы.

И я так понял он спрашивает, какой паттерн подойдет, когда есть много обьектов и они перебирают друг друга.
Короче как в играх, ему надо, что бы обьекты взаимодействовали друг с другом, например изменяли друг другу значения и т.д. и т.п.

Я сам задаюсь вопросом. Создавая игру или что-то, где много объектов в 2D пространстве. Как научить их взаимодействовать друг с другом. Либо систему сообщений пилить, где один отправляет сообщение "ищу цель в диапазоне N", а другие, когда дойдет до них очередь - дадут ответ "Я нахожусь в диапазоне N", либо в разделяемые пулы по пространству (чанки те же) либо еще как то, ибо перебирать все - сильно накладно.
0
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 45
04.03.2016, 11:24  [ТС] 6
Цитата Сообщение от Nosey Посмотреть сообщение
Так что вам надо?
Опишу на словах.
Задача:
Есть пулл(набор) объектов одного класса.

Цитата Сообщение от Valeryn Посмотреть сообщение
Как научить их взаимодействовать друг с другом.
да надо их научить взаимодействовать с друг другом.
Но очень хотелось инкапсулировать обработку в самом классе.

Предположительное решение:

Двойной перебор. т.е.

1. создаем статический map в структуре класса
C++
1
2
      static std::map<int, some*> myMap;
      static int i = 0;   // каунтер
2. Инициализируем:
C++
1
2
      int some::countObj = 0;
      map<int, some*> some::objects = { { 0, nullptr } };
3. Наполняем map в конструкторе класса:
(это две попытки/варианта) но по моим прикидкам оптимальнее наполнять
структуру именно в конструкторе
C++
1
2
      objects.insert(pair<int, some*>(objects.size() + 1, this)); // 
      //objects.at(this) = objects.begin()->first+1;
4. Сверка:
сверяем 2 вещи
а. объект сверяется не сам с собой!!!
б. важный нам параметр (в даном случае структура <b>Pos</b>)
(<i>"красивее" всего показалось реализовать в операторе</i>)
C++
1
2
3
4
bool some::operator==(const some& obj) const
{
    return this !=obg && this->mySrt == obj.mySrt
}
5. Дальше почти все:
О классе:
объект имеет
"состояния" поля
и
"действия" методы
(которые собираем в один стартер action() )

во внешнем классе при создании объекта
наполняем простой вектор объектами нашего класса
C++
1
2
3
4
5
6
7
8
9
    handleSomeClass::handleSomeClass(int _W, int _H)
    {
        // init some filds;
                //. . . 
                //. . . 
        for (int i = 0; i < 10; i++){   
            allObjects.push_back(new some());
        }
    };
у нашего объекта есть не только внутренние "реакции"
но и внешние.
В каком либо месте происходит
C++
1
2
3
       for(auto i : allObjects)
           //... handle of external methods
           i->Compare()
где Compare()
C++
1
2
3
4
5
void Compare()
{
       for(auto j : myMap)
           if(this == j.second)
               this->action();        // Yeah!!! GoGoGo!!! (internal actions)
то есть по итогу имеем простую двойную сверку
набора объектов самих с собой, исключая пересечение одинаковых
и заодно имеем возможность инкапсулировать взаимодействия между самими объектами.

Добавлено через 42 минуты
Цитата Сообщение от Valeryn Посмотреть сообщение
ибо перебирать все - сильно накладно.
Однозначно согласен. Где-то в продакшене при большой нагрузке чистый перевод ресурса((
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
04.03.2016, 15:33 7
Всё равно не понятно. (Много ненужных подробностей).

Если я правильно понял:
У Вас есть коллекция объектов. Вам среди них нужно найти все пары объектов, для которых выполняется некое условие ("равны по заданному набору параметров").
Так?

Тогда эффективней будет сначала отсортировать коллекцию по этому набору параметров (плюс уникальный ключ, чтобы дубликаты были рядом), а потом пройтись по ней, сравнивая соседние объекты.
0
04.03.2016, 15:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2016, 15:33
Помогаю со студенческими работами здесь

Почему паттерн абстрактная фабрика - паттерн уровня объектов, если в нём могут быть статические отношения?
Взято из Шевчук А., Охрименко Д., Касьянов А. Design Patterns via C#. Приемы...

Как связать между собой 3 класса
Подскажите пожалуйста, как можно связать между собой 3 класса.

Присваивание объектов одного типа между собой и передача объекта в функцию по значению
При первом знакомстве с С++ усиленно не могу понять вот такие моменты : 1. Имеем вот такой код : ...

Как объединить 3 класса между собой?(Калькулятор)
Добрый день уважаемые форумчане. Я прошу у Вас помощи,уже долгое время пытаюсь сделать это. И так...


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

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

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