Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 45

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

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

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

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

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

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


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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.03.2016, 23:27
Ответы с готовыми решениями:

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

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

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

6
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
04.03.2016, 00:27
Цитата Сообщение от axedmin Посмотреть сообщение
тег кода должен быть [СРР] [/СРР] ?
Да. Вот про тэги.
1
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 45
04.03.2016, 01:10  [ТС]
Спасибо , буду знать, а то по привычкe [CODE]
А по "теме" можете что-то подсказать?
Был бы очень благодарен)))
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
04.03.2016, 01:31
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
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от 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
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
04.03.2016, 15:33
Всё равно не понятно. (Много ненужных подробностей).

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

Тогда эффективней будет сначала отсортировать коллекцию по этому набору параметров (плюс уникальный ключ, чтобы дубликаты были рядом), а потом пройтись по ней, сравнивая соседние объекты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2016, 15:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru