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

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

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

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

13.11.2012, 02:17. Просмотров 449. Ответов 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();
};
Как сделать так, что-бы при инициализации класса я для каждой кнопки задал свое действие? Есть советы или другие реализации - буду благодарен за наставления. (знаю как реализовать такое на джаве, через абстрактные классы, оно там немного проще будет... но нужно на С++)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 02:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Действие для кнопки при инициализации класса (C++):

Синтаксическая ошибка при инициализации класса - C++
Ругается на инициализацию списком struct Cord { int x=0, y=0, z=0; }; class Point { public:

Ошибка при инициализации элемента класса - C++
Добрый день, Нужна помощь более опытных форумчан, в поиске ошибки. Есть фрагмент кода: #include "stdafx.h" #include <iostream> ...

Использование универсальной инициализации для объектов своего класса - C++
Здравствуйте! Все мы знаем, что поля структуры мы можем красиво инициализировать через {...}. Тогда мы std::vector структур можем...

Как реализовать конструктор с параметрами для инициализации полей класса? - C++
Подскажите как реализовать конструктор с параметрами для инициализации полей класса.

Как для шаблонного класса определить действие для частного случая - C++
Всем привет. Подскажите как для шаблонного класса определить действие для частного случая. По книге запись должна быть примерно такой: ...

Напишите конструктор для инициализации объекта класса Time, который может использовать текущее время, возвращаемое функцией time (). - C++
Помогите пожалуйста написать программу на С++. Просто скоро курсовую сдавать, а классы мы еще не разобрали и не успеваем. Поэтому не знаю...

9
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 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);};
};
1
zetsin
0 / 0 / 0
Регистрация: 13.05.2012
Сообщений: 3
15.11.2012, 11:59  [ТС] #3
Спасибо большое, буду тестить.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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();
}
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 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()));
Что в итоге?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2012, 15:12 #6
Kuzia domovenok, Функцию set_strategy сделать не проблема.) Зачем мне метод selectStrategy по айдишнику?
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
15.11.2012, 15:13 #7
C++
1
b = Button(button_beh(new Button2()), GraphicsStrategy(b.getGraStrategy()), OtherStrategy(b.getOtherStrategy())...);
Так что ли будет код развиваться?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2012, 15:18 #8
Kuzia domovenok, Я знаете-ли, над развитием кода, когда пишу на форуме обычно не задумываюсь.) Развития вашего кода я как-то не наблюдаю. Зависит все же от потребностей, а обсуждать сферический код в вакууме желания нету
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 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 минут
вот, что будет даже если использовать твои классы.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2012, 15:30 #10
Kuzia domovenok, Зачем из задачи про выполнение разных действий, в зависимости от того, как инициализирована кнопка делать что-то совершенно другое? + к тому, свитч как раз в основном, усложняет расширение функционала. Впринципе, я определенно согласен, что для задачи которую предоставил ты, свитч будет скорее всего самым простым выбором.
0
15.11.2012, 15:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 15:30
Привет! Вот еще темы с ответами:

Для чего при инициализации переменной писать на конце числа первую букву типа? - C++
Например, long long a=123456789123344LL чем будет отличаться от long long a=123456789123344 ?

Объявление класса после инициализации - C++
Подскажите возможно ли объявление класса в такой последовательности, чтобы вместо объявления написать class car;, просто видел в некоторых...

Порядок инициализации членов класса - C++
Здравствуйте форумчане. Столкнулся с проблемой. Не могу найти доходчивой статьи на данный вопрос про инициалиазцию членов в классе. ...

Ошибка инициализации объекта, конструктором класса - C++
Добрый день. Написал программу. Создание класса (упражнение из книги Дейтеля) &quot;Создайте класс с именем Account, которым мог бы...


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

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

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