Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Множественное включение или как не надо создавать классы

11.02.2021, 21:48. Показов 1559. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я не понимаю. До меня просто не доходит. Допустим, я делаю библиотеку которая будет очень быстро кликать в том месте где расположен курсор. В нем будет два класса Clicker и Events. В классе Clicker будет главная функция с которой все начнется и функция отвечающая за цикл в котором будут эти самые клики. Типа так:

C++
1
2
3
4
5
6
7
8
9
10
11
class Clicker
{
public:
    static int attach(); // Вызывается когда DLL_PROCESS_ATTACH
    static int detach(); // Вызывается когда DLL_PROCESS_DETACH 
 
    static DWORD WINAPI clicker(LPVOID hwnd);
 
    static HANDLE thread;
    static bool state;
};
В классе Events будет находиться код который устанавливает отлов событий мыши и обработчик событий мыши. Если нужное мне условие в этом обработчике выполнилось, класс Events создаёт поток с функцией из класса Clicker которая как раз таки и отвечает за клики. Типа так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Events
{
public:
    static bool attach(DWORD thread); // Создает поток с функцией loop (вызывается из Clicker::attach)
    static bool detach(); // Удаляет SetWindowsHookEx (вызывается из Clicker::detach)
 
private:
    static DWORD WINAPI loop(LPVOID thread); // Устанавливает SetWindowsHookEx
    static LRESULT CALLBACK handler(int nCode, WPARAM wParam, LPARAM lParam); // Обрабатывает события
 
    static HANDLE thread;
    static HHOOK hook;
};
И теперь вот в чем проблема. Для того чтобы из класса Clicker вызвать функцию установки отлова событий мыши в классе Events нужно подключить этот Events к Clicker. А чтобы потом из Events создать поток с функцией из класса Clicker которая отвечает за клики и присвоить хендл потока переменной класса Clicker нужно подключить к Events класс Clicker. И получается возникает множественное подключение или как там это называется. Решается при помощи #pragma once, но как мне кажется то что мне приходится использовать #pragma once уже говорит о том что я что-то не правильно реализовал. Но возникает еще одна проблема. Допустим я добавил к классам этот #pragma once и сделал функцию и две переменные класса Clicker protected (вообще хотелось бы private но я слышал что private нельзя наследовать чтобы иметь доступ) Получилось типа так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Clicker
{
public:
    static int attach(); // Вызывается когда DLL_PROCESS_ATTACH
    static int detach(); // Вызывается когда DLL_PROCESS_DETACH 
 
protected:
    static DWORD WINAPI clicker(LPVOID hwnd);
 
    static HANDLE thread;
    static bool state;
};
Теперь чтобы я мог вызывать функцию clicker из класса Clicker мне нужно наследовать класс Clicker классом Events

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Events:Clicker
{
public:
    static bool attach(DWORD thread); // Создает поток с функцией loop (вызывается из Clicker::attach)
    static bool detach(); // Удаляет SetWindowsHookEx (вызывается из Clicker::detach)
 
private:
    static DWORD WINAPI loop(LPVOID thread); // Устанавливает SetWindowsHookEx
    static LRESULT CALLBACK handler(int nCode, WPARAM wParam, LPARAM lParam); // Обрабатывает события
 
    static HANDLE thread;
    static HHOOK hook;
};
И тут уже #pragma once не помогает. Пожалуйста, объясните мне, идиоту, как делать правильно. Как разбивать на классы и продумывать все это? Я думаю что я в корне делаю все не правильно и мне нужен кто-то кто смог бы мне объяснить как нужно делать.

Добавлено через 3 минуты
Желательно на примере ибо я тупой
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2021, 21:48
Ответы с готовыми решениями:

в WinAVR можно создавать классы или нет?
пишу так ctoss myCtoss { public: myCtoss(); }; ругается, говорит, что ...

Как создавать классы
объясните, пожалуйста, как создавать классы? я уже столько всего прочитал, но ничего не понял!(

Как создавать классы?
Кто может объяснить, как пользоваться классами в C++ Builder?

30
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 15:06
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Я думаю что я в корне делаю все не правильно и мне нужен кто-то кто смог бы мне объяснить как нужно делать.
Правильно думаешь. Зачем тебе понадобились классы, у которых все методы и переменные являются статическими?
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.02.2021, 16:54  [ТС]
oleg-m1973, а как нужно?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 16:57
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
oleg-m1973, а как нужно?
Не знаю. Я ж не знаком с этой задачей.
Единственно, могу посоветовать - не пытайся сделать сразу всё (а именно так это выглядит сейчас), решай задачу поэтапно.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.02.2021, 17:22  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
не пытайся сделать сразу всё
я и не пытался, это легкий проект который по идее должен давать возможность быстро кликать в окне где расположен курсор. Я думаю что правильнее делать весь проект в классах, кроме DllMain конечно. Так и удобнее и правильнее. Разве нет?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 17:25
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Я думаю что правильнее делать весь проект в классах, кроме DllMain конечно. Так и удобнее и правильнее. Разве нет?
Ну, вот я здесь вижу, что с классами ты работать не умеешь точно. А без классов ты можешь эту задачу решить?

Добавлено через 1 минуту
Если можешь, то сделай и покажи. А я потом подскажу тебе, как её сделать с классами.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.02.2021, 17:50  [ТС]
oleg-m1973, без классов я это уже давно реализовал, но потом решил перенести в классы чтобы все было по человечески. Как я уже сказал, если не наследовать класс то все вполне нормально компилируется (#pragma once помогает) но как мне кажется я изначально неправильно понимаю как нужно делать в классах. Я думаю что #pragma once мне бы вовсе не понадобился если бы я делал в классах но правильно. А как правильно я не знаю. Именно по этому я и спросил здесь, чтобы мне подсказали как нужно реализовывать классы чтобы не было через жопу (как у меня)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 17:55
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
без классов я это уже давно реализовал, но потом решил перенести в классы чтобы все было по человечески.
Ну, раз у тебя уже всё работает, то и забей на эти классы. Либо потренируйся на какой-нибудь другой задаче.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.02.2021, 18:05  [ТС]
oleg-m1973, -__- я не понимаю зачем мне на чем-то тренироваться если у меня представление о том как надо на классы разбивать проект в корне не правильное, мне нужно что-бы кто-то ткнул меня и сказал как нужно делать чтобы не было таких проблем как я описал выше
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2021, 18:06
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
мне нужно что-бы кто-то ткнул меня и сказал как нужно делать чтобы не было таких проблем как я описал выше
Я вроде тебя ткнул и сказал, что нужно делать
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.02.2021, 20:26  [ТС]
oleg-m1973,

upd. Я выложил не полный код и только сейчас понял что все таки лучше будет если я выложу полный, подождите пожалуйста пару минут
Вложения
Тип файла: 7z Clicker.7z (3.1 Кб, 8 просмотров)
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.02.2021, 20:49  [ТС]
oleg-m1973, вот полный код который я хотел перенести в классы чтобы было по человечески
Вложения
Тип файла: 7z Clicker.7z (3.1 Кб, 12 просмотров)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.02.2021, 14:40
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
oleg-m1973, вот полный код который я хотел перенести в классы чтобы было по человечески
Не знаю, насколько твой кликер сделан правильно.
Здесь достаточно будет одного класса, который будет в конструкторе делать то, что у тебя делается в case DLL_PROCESS_ATTACH, а деструкторе - то, что в case DLL_PROCESS_DETACH
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
13.02.2021, 19:54  [ТС]
oleg-m1973, Сделан правильно, правда я надеялся на какой-то пример, но ладно.. А почему именно в конструкторе? Почему все в одном классе? Я читал, в некоторых источниках сказано что класс должен отвечать за что-то одно. Тем более, это не статичный класс (с конструктором) но мне ведь несколько экземпляров не понадобится.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.02.2021, 19:59
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
oleg-m1973, Сделан правильно, правда я надеялся на какой-то пример, но ладно.. А почему именно в конструкторе?
Ну а где?
Делаешь класс, параметром конструктора делаешь имя/класс окна, которое нужно найти. В DLL_PROCESS_ATTACH создаёшь экземпляр этого класса, по new. В DLL_PROCESS_DETACH делаешь delete.

Добавлено через 43 секунды
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Я читал, в некоторых источниках сказано что класс должен отвечать за что-то одно.
У тебя там только одно действие и есть
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
13.02.2021, 21:31  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У тебя там только одно действие и есть
Поиск окна через FindWindow, установка отлова событий мыши, обработчик событий мыши, запуск кликера из обработчика если соблюдены условия..

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну а где?
Я все равно не понимаю почему именно через экземпляр класса и конструктор, если гораздо более логично использовать полностью статичный класс в котором просто вызывать главную функцию при старте. Несколько ведь таких экземпляров я все равно использовать не буду.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.02.2021, 21:33
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
если гораздо более логично использовать полностью статичный класс в котором просто вызывать главную функцию при старте
Потому что "полностью статичный класс" - это маразм. Лучше уж оставь так как есть.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
13.02.2021, 21:37  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
создаёшь экземпляр этого класса, по new. В DLL_PROCESS_DETACH делаешь delete.
и почему создание через new и delete если гораздо более логично создавать класс просто объявляя его вот типа так

ClassName myClass;

Добавлено через 1 минуту
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Потому что "полностью статичный класс" - это маразм.
От таких объяснений у меня наоборот будет больше вопросов и сомнений. Я понимаю что Вы - явно лучше разбираетесь, но мне бы хотелось услышать почему Вы так считаете.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.02.2021, 21:42
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
и почему создание через new и delete если гораздо более логично создавать класс просто объявляя его вот типа так
Потому что иначе его придётся делать статическим. А это dll, там лучше вообще не делать никакого кода, который ты не контролируешь лично. То что твой код выполняется в DllMain, это уже плохо

Добавлено через 3 минуты
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
От таких объяснений у меня наоборот будет больше вопросов и сомнений. Я понимаю что Вы - явно лучше разбираетесь, но мне бы хотелось услышать почему Вы так считаете.
Потому что если в классе только статические методы/переменные, то это ничем не отличается от обычных глобальных функций и переменных. Единственно, зачем это может понадобиться, это передавать имена статических методов в шаблон. У тебя есть такая необходимость?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
13.02.2021, 21:53
eXpl01TeR, как эту библиотеку планируется использовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2021, 21:53
Помогаю со студенческими работами здесь

Задача про множественное наследование и включение
Добрый день. Решаю задачу из Праты глава 14. Условие: Класс Person предназначен для хранения имени и фамилии человека. Кроме...

Как создавать классы, структуры и их экземпляры?
Объясните вкратце пожалуйста, как создавать классы и самое важное их объекты. Читаю msdn уже 5-ый раз всё никак понять не могу. Заранее...

Как правильно надо создавать триггер
Нужно создать триггер , у меня есть 2 таблички, create table vra4i(vnum number primary key,special varchar2(30),vfio varchar2(30)); ...

Включение компьютера не осуществляется как надо
Здравствуйте ребят. Нужна помощь. Есть проблемы с включением ПК. То-есть, включаю в сеть удлинитель, в который всё подключено, жму кнопку...

Можно ли в JAVA создавать классы и обьекты такие как в С++?
Можно ли в JAVA создавать классы и обьекты такие как в С++? Типа: class Class1 {public: int a; double...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru