Помогите разобраться с объектами
Я пытаюсь разобраться с ооп, и наткнулся на проблему:
Допустим я определяю класс CMyClass
Потом создаю объект CMyClass mcMyObject
Тогда все методы и пр объекта выглядят как mcMyObject.MyMethod();
Это все понятно, но как сделать, допустим, объект класса CMyWindow, в котором можно было бы создавать свои объекты класса CMyButton, да чтобы все еще с произвольными названиями, ну как в виндовом GUI.
Чтобы в результате получилось что либо похожее на
MyWindow.MyButton.Click()
Прошу прощения за такую путаницу и многословие, но как это все по умному называется - не знаю :(
Помогите новичку!
Я пытаюсь разобраться с ооп, и наткнулся на проблему:
Допустим я определяю класс 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()
class TMyButton;
class TMyWindow
{
...
public:
TMyButton MyButton;
...
};
class TMyButton
{
...
public:
void Click();
...
};
//------------------------------------------
TMyWindow MyWindow;
MyWindow.MyButton.Click()
Ага, понятно!
А можно это как-то сделать во время работы программы?
Т.е. не определять это дело в классе изначально, а например добавить эту "кнопку" когда окно уже создано. Я вроде смог это сделать как динамический массив указателей на объекты, но как то это глючно и неудобно. Что-то вроде
MyWindow.MyArray[4].Click()
Как это свести к
MyWindow.[Произвольное имя].Click() ?
Ага, понятно!
А можно это как-то сделать во время работы программы?
Т.е. не определять это дело в классе изначально, а например добавить эту "кнопку" когда окно уже создано. Я вроде смог это сделать как динамический массив указателей на объекты, но как то это глючно и неудобно. Что-то вроде
MyWindow.MyArray[4].Click()
Как это свести к
MyWindow.[Произвольное имя].Click() ?
Сделать это сложно и связано с извратами, да и в этом нет смысла. Попробуй привести необходимоть такого подхода и мы постараемся показать, что сделать иначе будет и проще и нагляднее.
Сделать это сложно и связано с извратами, да и в этом нет смысла. Попробуй привести необходимоть такого подхода и мы постараемся показать, что сделать иначе будет и проще и нагляднее.
Эээ... Да не то что бы это очень нужно... Но очень интересно :)
Я просто для себя решил написать что-то наподобие простенького GUI, и мне показалось, что было бы хорошо иметь такую возможность...
И вот тогда в добавок еще три вопроса:
1. Насколько жизнеспособна эта хрень с массивами указателей на объекты
2. Как создать такой вот "объект в объекте", описав его не в классе? Ведь если я делаю класс окна, то кнопки-то в окнах будут разные, и надо их описывать не в классе, а в каждом окне персонально. Ну а доступ хочется как в винде - через символьное имя, а не индекс массива
3. И как это все называется - что бы хоть спросить можно было четко, а не словоблудием заниматься?
И вот тогда в добавок еще три вопроса:
1. Насколько жизнеспособна эта хрень с массивами указателей на объекты
2. Как создать такой вот "объект в объекте", описав его не в классе? Ведь если я делаю класс окна, то кнопки-то в окнах будут разные, и надо их описывать не в классе, а в каждом окне персонально. Ну а доступ хочется как в винде - через символьное имя, а не индекс массива
3. И как это все называется - что бы хоть спросить можно было четко, а не словоблудием заниматься?
1. Срок жизни в идеале определяется сроком существования процесса.
2. Думаю, достаточно иметь в классе массив (или контейнер) указателей на некоторый базовый класс-интерфейс, и добавлять созданные объекты различных классов порожденных от этого базового класса. Т.е. типа такого:
{
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").
1. Срок жизни в идеале определяется сроком существования процесса.
2. Думаю, достаточно иметь в классе массив (или контейнер) указателей на некоторый базовый класс-интерфейс, и добавлять созданные объекты различных классов порожденных от этого базового класса. Т.е. типа такого:
{
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]
Но я уже запутался - по моему это я изначально сбредил. Сейчас разберусь с полученной информацией - и соображу :)
Еще раз спасибо!