Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите разобраться с объектами

6.9K
05 октября 2004 года
fightcat
17 / / 07.09.2004
Помогите новичку!
Я пытаюсь разобраться с ооп, и наткнулся на проблему:
Допустим я определяю класс CMyClass
Потом создаю объект CMyClass mcMyObject
Тогда все методы и пр объекта выглядят как mcMyObject.MyMethod();
Это все понятно, но как сделать, допустим, объект класса CMyWindow, в котором можно было бы создавать свои объекты класса CMyButton, да чтобы все еще с произвольными названиями, ну как в виндовом GUI.
Чтобы в результате получилось что либо похожее на
MyWindow.MyButton.Click()

Прошу прощения за такую путаницу и многословие, но как это все по умному называется - не знаю :(
246
05 октября 2004 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by fightcat
Помогите новичку!
Я пытаюсь разобраться с ооп, и наткнулся на проблему:
Допустим я определяю класс CMyClass
Потом создаю объект CMyClass mcMyObject
Тогда все методы и пр объекта выглядят как mcMyObject.MyMethod();
Это все понятно, но как сделать, допустим, объект класса CMyWindow, в котором можно было бы создавать свои объекты класса CMyButton, да чтобы все еще с произвольными названиями, ну как в виндовом GUI.
Чтобы в результате получилось что либо похожее на
MyWindow.MyButton.Click()

Прошу прощения за такую путаницу и многословие, но как это все по умному называется - не знаю :(



class TMyButton;
class TMyWindow
{
...
public:
TMyButton MyButton;
...
};

class TMyButton
{
...
public:
void Click();
...
};
//------------------------------------------
TMyWindow MyWindow;
MyWindow.MyButton.Click()

6.9K
05 октября 2004 года
fightcat
17 / / 07.09.2004
Цитата:
Originally posted by GIZMO


class TMyButton;
class TMyWindow
{
...
public:
TMyButton MyButton;
...
};

class TMyButton
{
...
public:
void Click();
...
};
//------------------------------------------
TMyWindow MyWindow;
MyWindow.MyButton.Click()



Ага, понятно!
А можно это как-то сделать во время работы программы?
Т.е. не определять это дело в классе изначально, а например добавить эту "кнопку" когда окно уже создано. Я вроде смог это сделать как динамический массив указателей на объекты, но как то это глючно и неудобно. Что-то вроде
MyWindow.MyArray[4].Click()
Как это свести к
MyWindow.[Произвольное имя].Click() ?

3
05 октября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by fightcat

Ага, понятно!
А можно это как-то сделать во время работы программы?
Т.е. не определять это дело в классе изначально, а например добавить эту "кнопку" когда окно уже создано. Я вроде смог это сделать как динамический массив указателей на объекты, но как то это глючно и неудобно. Что-то вроде
MyWindow.MyArray[4].Click()
Как это свести к
MyWindow.[Произвольное имя].Click() ?



Сделать это сложно и связано с извратами, да и в этом нет смысла. Попробуй привести необходимоть такого подхода и мы постараемся показать, что сделать иначе будет и проще и нагляднее.

6.9K
05 октября 2004 года
fightcat
17 / / 07.09.2004
Цитата:
Originally posted by Green


Сделать это сложно и связано с извратами, да и в этом нет смысла. Попробуй привести необходимоть такого подхода и мы постараемся показать, что сделать иначе будет и проще и нагляднее.



Эээ... Да не то что бы это очень нужно... Но очень интересно :)
Я просто для себя решил написать что-то наподобие простенького GUI, и мне показалось, что было бы хорошо иметь такую возможность...

И вот тогда в добавок еще три вопроса:
1. Насколько жизнеспособна эта хрень с массивами указателей на объекты
2. Как создать такой вот "объект в объекте", описав его не в классе? Ведь если я делаю класс окна, то кнопки-то в окнах будут разные, и надо их описывать не в классе, а в каждом окне персонально. Ну а доступ хочется как в винде - через символьное имя, а не индекс массива
3. И как это все называется - что бы хоть спросить можно было четко, а не словоблудием заниматься?

3
05 октября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by fightcat

И вот тогда в добавок еще три вопроса:
1. Насколько жизнеспособна эта хрень с массивами указателей на объекты
2. Как создать такой вот "объект в объекте", описав его не в классе? Ведь если я делаю класс окна, то кнопки-то в окнах будут разные, и надо их описывать не в классе, а в каждом окне персонально. Ну а доступ хочется как в винде - через символьное имя, а не индекс массива
3. И как это все называется - что бы хоть спросить можно было четко, а не словоблудием заниматься?



1. Срок жизни в идеале определяется сроком существования процесса.
2. Думаю, достаточно иметь в классе массив (или контейнер) указателей на некоторый базовый класс-интерфейс, и добавлять созданные объекты различных классов порожденных от этого базового класса. Т.е. типа такого:

Код:
class CBaseBtn
{
public:
  void Click()
  {
    // Base Implimentation
  }
  ....
};

class CMyWindow
{
  std::vector<CBaseBtn*> listBtns;
public:
  int AddButton(CBaseBtn*); // возвращает индекс
};

// где-то в далекой галактике
class CExtraNewSuperBtn :public CBaseBtn
{
public:
  void Click()
  {
    // Implimentation for this class
  }
};

CExtraNewSuperBtn* p = new CExtraNewSuperBtn;
MyWindow.AddButton(p);

Что ты подразумеваешь под "доступ хочется как в винде - через символьное имя"?

3. Назвать одним словом здесь невозможно. Можно применить понятия паттернов. Как я понимаю тебя интересуют паттаерны "Компоновщик" ("Composite") и "Посредник" ("Mediator").
6.9K
05 октября 2004 года
fightcat
17 / / 07.09.2004
Цитата:
Originally posted by Green


1. Срок жизни в идеале определяется сроком существования процесса.
2. Думаю, достаточно иметь в классе массив (или контейнер) указателей на некоторый базовый класс-интерфейс, и добавлять созданные объекты различных классов порожденных от этого базового класса. Т.е. типа такого:
Код:
class CBaseBtn
{
public:
  void Click()
  {
    // Base Implimentation
  }
  ....
};

class CMyWindow
{
  std::vector<CBaseBtn*> listBtns;
public:
  int AddButton(CBaseBtn*); // возвращает индекс
};

// где-то в далекой галактике
class CExtraNewSuperBtn :public CBaseBtn
{
public:
  void Click()
  {
    // Implimentation for this class
  }
};

CExtraNewSuperBtn* p = new CExtraNewSuperBtn;
MyWindow.AddButton(p);

Что ты подразумеваешь под "доступ хочется как в винде - через символьное имя"?

3. Назвать одним словом здесь невозможно. Можно применить понятия паттернов. Как я понимаю тебя интересуют паттаерны "Компоновщик" ("Composite") и "Посредник" ("Mediator").



Огромный пасиба! :)

Ага, значит надо для каждого объекта создавать-таки класс на основе базового...

Доступ через символьное имя - ну как в Delphi, например: form1.Button2.caption = 'abc';
Вот чтобы было это Button2, а не ElementArray[1]
Но я уже запутался - по моему это я изначально сбредил. Сейчас разберусь с полученной информацией - и соображу :)

Еще раз спасибо!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог