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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zetsin
0 / 0 / 0
Регистрация: 13.05.2012
Сообщений: 3
#1

Действие для кнопки при инициализации класса - C++

13.11.2012, 02:17. Просмотров 426. Ответов 9
Метки нет (Все метки)

Предположим есть класс Button
C++
1
2
3
4
5
6
7
8
9
#include "string.h"
class Button
{
public:
    Button();
    int x,y;
    String text;
    virtual void Action();
};
Как сделать так, что-бы при инициализации класса я для каждой кнопки задал свое действие? Есть советы или другие реализации - буду благодарен за наставления. (знаю как реализовать такое на джаве, через абстрактные классы, оно там немного проще будет... но нужно на С++)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 02:17     Действие для кнопки при инициализации класса
Посмотрите здесь:

C++ При перегрузке оператора для класса не получается использовать имя переменной такое же, как в описании класса
C++ Объявление класса после инициализации
C++ Ошибка инициализации объекта, конструктором класса
C++ Ошибка при инициализации элемента класса
Напишите конструктор для инициализации объекта класса Time, который может использовать текущее время, возвращаемое функцией time (). C++
C++ Для чего при инициализации переменной писать на конце числа первую букву типа?
C++ Как для шаблонного класса определить действие для частного случая
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
13.11.2012, 02:43     Действие для кнопки при инициализации класса #2
Думаю подойдёт паттерн "стратегия" (Во какое умное слово как раз вчера вычитал!)

Добавлено через 11 минут
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
class ButtonBehaviour(){
  public:
    virtual void onClickAction()=0;
    virtual int Action_id()=0;
};
class FirstButtonBehaviour:public ButtonBehaviour{
  public:
    void onClickAction(){ MessageBox(Hwnd, "first", "button method", MB_OK);}
    int Action_id(){return 1;};
};
class SecondButtonBehaviour:public ButtonBehaviour{
  public:
    void onClickAction(){ MessageBox(Hwnd, "second", "button method", MB_OK);}
    int Action_id(){return 2;};
};
class Button{
  ButtonBehaviour* action;
  public:
  Button(){action=new FirstButtonBehaviour();}
  ~Button(){delete action;}
  void SetBehaviour(int id){
    if (id!=action->Action_id())
    switch (id){
      case 1: {delete action; action=new FirstButtonBehaviour();} break; 
      case 2: {delete action; action=new SecondButtonBehaviour();} break; 
    } 
  }
  void click(){
    action->onClickAction();
  }
};
Добавлено через 12 минут
Цитата Сообщение от zetsin Посмотреть сообщение
Как сделать так, что-бы при инициализации класса я для каждой кнопки задал свое действие? Есть советы или другие реализации - буду благодарен за наставления. (знаю как реализовать такое на джаве, через абстрактные классы, оно там немного проще будет... но нужно на С++)
Если изменение поведения не предвидится просто создавай абстрактный класс.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Button{
public:
Button(){};
virtual void Action()=0;
};
class Button1: public Button{
public:
Button1(){};
void Action(){MessageBox(Hwnd, "second", "button method", MB_OK);};
};
class Button2{
public:
Button2(){};
void Action(){MessageBox(Hwnd, "second", "button method", MB_OK);};
};
zetsin
0 / 0 / 0
Регистрация: 13.05.2012
Сообщений: 3
15.11.2012, 11:59  [ТС]     Действие для кнопки при инициализации класса #3
Спасибо большое, буду тестить.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2012, 12:48     Действие для кнопки при инициализации класса #4
Kuzia domovenok, Вот свитч-то тут не в тему совсем... Плюс, не запрещен и не реализован конструктор копирования/оператор присваивания.

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
#include <iostream>
#include <memory>
 
class ButtonBehaviour
{
public:
   ~ButtonBehaviour() { }
   virtual void on_click() = 0;
};
 
class Button1 : public ButtonBehaviour
{
public:
   void on_click() { std::cout << "first button" << std::endl; }
};
 
class Button2 : public ButtonBehaviour
{
public:
   void on_click() { std::cout << "second button" << std::endl; }
};
 
typedef std::shared_ptr<ButtonBehaviour> button_beh;
 
class Button
{
public:
   Button() : behaviour(new Button1()) { }
   Button(const button_beh& beh) : behaviour(beh) { }
   void click() { behaviour->on_click(); }
private:
   button_beh behaviour;
};
 
int main()
{
   Button b;
   b.click();
   b = Button(button_beh(new Button2()));
   b.click();
}
или же

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
#include <iostream>
#include <memory>
 
class ButtonBeh1
{
public:
   static void on_click() { std::cout << "first button" << std::endl; }
};
 
class ButtonBeh2
{
public:
   static void on_click() { std::cout << "second button" << std::endl; }
};
 
template<typename ButtonStrategy = ButtonBeh1>
class Button
{
   typedef ButtonStrategy strategy;
public:
   void click() { strategy::on_click(); }
};
 
int main()
{
   Button<> b;
   b.click();
   Button<ButtonBeh2> b2;
   b2.click();
}
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
15.11.2012, 15:10     Действие для кнопки при инициализации класса #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Плюс, не запрещен и не реализован конструктор копирования/оператор присваивания.
Это минус, но я торопился донести суть.
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот свитч-то тут не в тему совсем...
В тему. Как раз в тему. Если тебе надо будет написать метод selectStrategy(int id) придётся писать
C++
1
2
3
4
5
6
7
8
... ...::selectStrategy(int id){ 
...
switch(id){
case...:....behaviour=button_beh(new Button2())...
case...
}
...
}
}

Добавлено через 6 минут
Более того! Помимо стратегии обработки нажатий в кнопке может храниться ещё много сущностей
информация о графической составляющей, например и.т.п.
и в примере, ты каждый раз создаёшь конструктором новую кнопку
Когда возникнет необходимость, чтобы при изменении стратегии нажатия, остальные элементы кнопки (графика) не менялись,
тебе придётся переписывать этот код.
C++
1
b = Button(button_beh(new Button2()));
Что в итоге?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2012, 15:12     Действие для кнопки при инициализации класса #6
Kuzia domovenok, Функцию set_strategy сделать не проблема.) Зачем мне метод selectStrategy по айдишнику?
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
15.11.2012, 15:13     Действие для кнопки при инициализации класса #7
C++
1
b = Button(button_beh(new Button2()), GraphicsStrategy(b.getGraStrategy()), OtherStrategy(b.getOtherStrategy())...);
Так что ли будет код развиваться?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2012, 15:18     Действие для кнопки при инициализации класса #8
Kuzia domovenok, Я знаете-ли, над развитием кода, когда пишу на форуме обычно не задумываюсь.) Развития вашего кода я как-то не наблюдаю. Зависит все же от потребностей, а обсуждать сферический код в вакууме желания нету
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
15.11.2012, 15:26     Действие для кнопки при инициализации класса #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Зачем мне метод selectStrategy по айдишнику?
Ну а как будет стратегия выбираться? В конечном итоге всё должно свестись к свитчу в том или ином месте программы. По айдишнику или по чему ещё.
Задача: изменять поведение кнопки в зависимости от изменения пользователем неких чекбоксов или текстовых полей в окне. Как ты её решишь без свитча?
C++
1
2
3
4
5
6
7
8
void OrderToChangeApplication(){
string s=Application.textbox1.GetText();
switch (s){
case ...: 
case ...: 
case ...: Button1.setBehaviour(button_beh(new Button2())); ... break;
}
}
Добавлено через 6 минут
вот, что будет даже если использовать твои классы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 15:30     Действие для кнопки при инициализации класса
Еще ссылки по теме:

Порядок инициализации членов класса C++
Как реализовать конструктор с параметрами для инициализации полей класса? C++
C++ Синтаксическая ошибка при инициализации класса
C++ Использование универсальной инициализации для объектов своего класса
C++ Копирующий конструктор в списке инициализации членов класса

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
15.11.2012, 15:30     Действие для кнопки при инициализации класса #10
Kuzia domovenok, Зачем из задачи про выполнение разных действий, в зависимости от того, как инициализирована кнопка делать что-то совершенно другое? + к тому, свитч как раз в основном, усложняет расширение функционала. Впринципе, я определенно согласен, что для задачи которую предоставил ты, свитч будет скорее всего самым простым выбором.
Yandex
Объявления
15.11.2012, 15:30     Действие для кнопки при инициализации класса
Ответ Создать тему
Опции темы

Текущее время: 14:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru