Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Динамическое добавление свойств обекту класса


Автор: Graf_h 21.4.2008, 17:29
Как организовать, точнее описать класс, чтобы я каждому обьекту класса мог динамически добавлять методы и члены данных в любом месте своей пргораммы? и что бы они были доступны в любом месте вызова обьекта

Автор: Daevaorn 21.4.2008, 17:31
Наследование?

Автор: Graf_h 21.4.2008, 17:33
Цитата(Daevaorn @  21.4.2008,  17:31 Найти цитируемый пост)
Наследование?


В смысле? причем тут наследование  smile 

Автор: vinter 21.4.2008, 18:05
Цитата(Graf_h @  21.4.2008,  18:29 Найти цитируемый пост)
Как организовать, точнее описать класс, чтобы я каждому обьекту класса мог динамически добавлять методы и члены данных в любом месте своей пргораммы? и что бы они были доступны в любом месте вызова обьекта

никак, объектам методы не добавляются.

Автор: Graf_h 22.4.2008, 09:21
Можна! Например ActionScript! там класы спроектированы так что я могу динамически создавать их методы или члены данных! 

Автор: Rififi 22.4.2008, 09:31
Graf_h, 
ActionScript не не является компилируемым языком.
а так... можно сделать COM-обьект на основе IDispatchEx

Автор: MAKCim 22.4.2008, 09:31
Graf_h, 
хватит оффтопить!
вам уже сказали, что нельзя такое сделать в С++

Автор: Lazin 22.4.2008, 09:33
Цитата(Graf_h @  22.4.2008,  09:21 Найти цитируемый пост)
ActionScript

фи какая гадость...

Добавлено через 2 минуты и 16 секунд
можно добавить к классу динамический массив объектов типа boost::any, и еще один динамический массив объектов типа boost::function< boost::any (boost::any)>, а толку с этого  smile 

Автор: Graf_h 22.4.2008, 09:52
Всем спасибо! 

Автор: mes 22.4.2008, 09:57
Ты хочешь писать скрипты или просто собрать класс из разных (уже написанных) функций ?
если скрипты- то подключай интерпретируемый язык - луа или питон

Автор: Graf_h 22.4.2008, 10:30
Цитата(mes @  22.4.2008,  09:57 Найти цитируемый пост)
Ты хочешь писать скрипты или просто собрать класс из разных (уже написанных) функций ?если скрипты- то подключай интерпретируемый язык - луа или питон

Нет, скрипты я нехочу писать smile 

Автор: mes 22.4.2008, 12:05
Цитата(Graf_h @  22.4.2008,  10:30 Найти цитируемый пост)

Нет, скрипты я нехочу писать   


покажи пример предполагаемой тобой функциональности, чтоб представить что ты хочешь

Автор: Graf_h 22.4.2008, 14:45
Цитата(mes @  22.4.2008,  12:05 Найти цитируемый пост)
покажи пример предполагаемой тобой функциональности, чтоб представить что ты хочешь

Это для того чо бы не ломать голову над тем что у меня должен делать обьект! Чтобы я в любой момент мог обьекту прицепиить то поведение какое мне нужно в определеный момент! Например как в ActionScript,кстати насколько я знаю ActioScript спроектирован на C++! вот мне и стало интересно каким способом разработчики этого добились!Кто хоть раз програмировал на AS тот поймет!Иногда бывает удобно просто прицепить то что мне нужно к отдельному обьекту, а не проектировать  всю иерархию!  smile 

Автор: Lazin 22.4.2008, 15:08
Это называется композиция объектов

Автор: Alek86 22.4.2008, 15:15
Цитата(Graf_h @  22.4.2008,  14:45 Найти цитируемый пост)
Чтобы я в любой момент мог обьекту прицепиить то поведение какое мне нужно в определеный момент!

может, простой динамический полиморфизм тебе поможет?

Автор: mes 22.4.2008, 15:35
Цитата(Graf_h @  22.4.2008,  14:45 Найти цитируемый пост)
Иногда бывает удобно просто прицепить то что мне нужно к отдельному обьекту, а не проектировать  всю иерархию!

 smile 

Автор: Graf_h 22.4.2008, 16:09
Код


class Game{
private:
static Game* _self;
Game();
~Game();
public: 
 static Game* Instance()
  {
    if(!_self) _self = new Game();
    return _self;
  }
}
void free(){
delete this; _self=NULL;
}

}

Вот примерно так! просто я начинаю новыйпроект и хочу спроектировать его правильно, просто и быстро! Вот это гарантирует что будет только один обьект! и мне нужно ему цыплять свойства примерно так:

Код

Game *newGame = Game::Instance();

newGame->status=false;
newGame->time =function(){
....
}



Код может быть с ошибками но сама идея понятна!
тоесть что бы сразу можно было вцепить то чт омне по ходу нужно!Эт намного облегчит проектирование smile!

Автор: Kappac 22.4.2008, 16:11
Код

class foo {
    .......
};

template<class &T> class bar {
       //Необходимые добавки
};

bar<foo> *obj = new bar<foo>();



Примерно так... 

Автор: JackYF 22.4.2008, 16:23
Угу. А ещё есть такая штука - указатели на функцию. Динамические донельзя smile

Автор: Graf_h 22.4.2008, 16:25
Цитата(JackYF @  22.4.2008,  16:23 Найти цитируемый пост)
Угу. А ещё есть такая штука - указатели на функцию. Динамические донельзя 

То как првильно спроектировать? а то придется все описывать... smile 

Автор: Daevaorn 22.4.2008, 17:04
Цитата(Lazin @  22.4.2008,  10:33 Найти цитируемый пост)
фи какая гадость...

Я уверен, что для флешера С++ не меньшая гадость. Так что слишком резко.

Автор: mes 22.4.2008, 17:34
Цитата(Graf_h @  22.4.2008,  16:09 Найти цитируемый пост)

Код

class Game{
private:
static Game* _self;
...


Вот примерно так! просто я начинаю новыйпроект и хочу спроектировать его правильно, просто и быстро! Вот это гарантирует что будет только один обьект! и мне нужно ему цыплять свойства примерно так:


Какой ужас! вначале объявить класс синглетоном а только потом его описывать.
"не каждая рыба-селедка, но каждая селедка - рыба"  © Льюис Кэролл 

Код

template <class T> class Singleton: public T ...
template <class T>  class TProperty 
{ public:
      void Set (T& value) { m_value=value; }
     T Get () {return m_value; }
  private:
    T m_value;
};

class CGame {
   public:
        TProperty<int> Status;
};
typedef Singleton<CGame> GameSingleton;



Цитата(Graf_h @  22.4.2008,  16:09 Найти цитируемый пост)
Код может быть с ошибками но сама идея понятна!

smile 


Автор: Graf_h 22.4.2008, 17:40
Цитата(mes @  22.4.2008,  17:34 Найти цитируемый пост)
Какой ужас! вначале объявить класс синглетоном а только потом его описывать.

Синглтон это так для страховки! а описывать его незачем! как мне добавить в этот обьект этого класа свойства которые не описаны в класе! вот проблема... smile  

Автор: mes 22.4.2008, 18:02
Цитата(Graf_h @  22.4.2008,  17:40 Найти цитируемый пост)
как мне добавить в этот обьект этого класа свойства которые не описаны в класе! вот проблема


Код


class MyDynamicObject
{
    public:
        void AddProperty (const std::string& name, const MyVariant& value) { m_PropertyMap[name]=value; }
        MyVariant GetProperty (const std::string& name) { /*упрошеный вариант*/ return m_PropertyMap[name]; }
    private:
        std::map<std::string,MyVariant> m_PropertyMap;
};


типа такого?
а ты уверене что тебе это облегчит разботку и отладку проги? 
именно поэтому и спрашивал примера твоего представления того что тебе нужно 

Автор: mes 22.4.2008, 18:23
 Сейчас прошелся по улице и кажись понял что тебе нужно .. и совсем не динамическое добавление свойств объекту...
тебе нужна именно композиция (кто то уже писал выше)  тогда каждую "маленькую задачу" ты будешь решать отдельно 
не влияя на код остального проекта и при всем этом все маленькие задачи будут одним целым. 

Автор: Graf_h 23.4.2008, 09:40
Цитата(mes @  22.4.2008,  18:02 Найти цитируемый пост)
а ты уверене что тебе это облегчит разботку и отладку проги? именно поэтому и спрашивал примера твоего представления того что тебе нужно 


Кода еще нет никакого,я сейчас хочу спроектировать, а уже потом начинать програмировать!Я впринцыпе хорошо знаю ActionScript, и вот что мне в нем нравится, что там я любому обьекту могу прицепить то свойство, которое мне "нравится", например, в AS есть встроенный класс MovieClip со своими свойствами.Но я могу дописать свои даже их не обявляе в классе! Вот я и задумался, можно ли такое сделать на с++,это намного облегчаеть проектирование и розработку!


Цитата(mes @  22.4.2008,  18:23 Найти цитируемый пост)
Сейчас прошелся по улице и кажись понял что тебе нужно .. и совсем не динамическое добавление свойств объекту...тебе нужна именно композиция (кто то уже писал выше)  тогда каждую "маленькую задачу" ты будешь решать отдельно не влияя на код остального проекта и при всем этом все маленькие задачи будут одним целым. 

Нет,нажаль не композиция, я знаю что это такое!Вот маленький пример,того что мне нужно:

Код

class A{
A();
virtual ~A();
}

A a;

a.param1=10;
a.param2=true;
a.param3=-12.5;
a.func()
   


Конечно же при таком создании класса компилятор будет ругатся! вот и вопрос как можно это решить,если вообще возможно

Автор: mes 23.4.2008, 09:53
Цитата(Graf_h @  23.4.2008,  09:40 Найти цитируемый пост)
Конечно же при таком создании класса компилятор будет ругатся! вот и вопрос как можно это решить,если вообще возможно 


в с++ обязательно описание должно предшествовать вызову - необходимо это для контроля типов. 
можно реализовать свой класс и вызывать методы по их строковому имени 
Код


A.exec ("method1", params(p1,p2,p3));

но тогда у тебя не будет ни какого контроля со стороны компилятора - поэтому в таких случаях используют не с++,
а языки с динамическим контролем типов

Автор: Lazin 23.4.2008, 09:59
есть 2 варианта этой проблемы, расширение свойств класса в compile time и в run time

в compile time решается наследованием, или включением, можно враппер какой-нибудь или декоратор написать и тд

в run time, для этого могут использоваться всякие вариантные типы данных, обобщенные функторы и тд.. но класс, в который ты что-то хочешь добавить, должен быть спроектирован особым образом, лучше в этом случае прикрутить скриптовый движок к программе(python, lua...), и реализовывать бизнес логику на нем  smile 

Автор: mes 23.4.2008, 10:01
Цитата(Graf_h @  23.4.2008,  09:40 Найти цитируемый пост)
Вот маленький пример,того что мне нужно:

и все таки я больше чем уверен, что ты ищешь причину своих трудностей не там ..

Цитата(mes @  22.4.2008,  15:35 Найти цитируемый пост)
Цитата(Graf_h @  22.4.2008,  14:45 )
Иногда бывает удобно просто прицепить то что мне нужно к отдельному обьекту, а не проектировать  всю иерархию!
   


до сих пор не привел ни одного примера, где тебе необходимо была бы такая возможность ))


Автор: Graf_h 23.4.2008, 10:18
Цитата(mes @  23.4.2008,  10:01 Найти цитируемый пост)
до сих пор не привел ни одного примера, где тебе необходимо была бы такая возможность ))

Вот пример:
Код

class Units{
Units()
virtual ~Units()
}

class Bots{
Bots();
virtual ~Bots();
}


больше никаких свойств.Далее:
Код

Units create(_x:float,_y:float){
Units new_Units;
new_Units.moving();
new_Units.fire();
new_Units.posx=_x;
new_Units.posy=_y;
new_Units.orientation;
new_Units.killed=false;
}

далее
Код

Units unit[2];
unit[0]= create(10,100)

Пример может не настолько удачный, но все же...

Автор: Fazil6 23.4.2008, 10:49
Цитата(Graf_h @  22.4.2008,  14:45 Найти цитируемый пост)
Иногда бывает удобно просто прицепить то что мне нужно к отдельному обьекту, а не проектировать  всю иерархию!

не понимаю чем это удобно...
Цитата(Graf_h @  22.4.2008,  14:45 Найти цитируемый пост)
Это для того чо бы не ломать голову над тем что у меня должен делать обьект!

как это? Один объект на все случаи жизни?
Цитата(Graf_h @  22.4.2008,  14:45 Найти цитируемый пост)
Чтобы я в любой момент мог обьекту прицепиить то поведение какое мне нужно в определеный момент!

пишешь кучу интерфейсов с нужным поведением каждый и от всех сразу наследуешься. В разных ситуациях юзаешь объект через разных предков.
А вообще есть довольно неплохое правило "одна задача - один класс"

Автор: vinter 23.4.2008, 11:00
то что ты хочешь это называется антипроектрование. Кстати как ты себе представляешь, что ты понаписывал кучу свойств к объекту? они должны быть где то определены, вот для этого и надо грамотно проектировать, исходя из вариантов использования выделять свойства и методы. Но все равно спроектировать с нуля готовую систему, которую потом можно просто переписать на язык, практически нереально, скорее всего потом столкнешься с какой нибудь трудностью. В процессе реализации

Автор: Graf_h 23.4.2008, 12:21
Понятно! всем спасибо за помощь  smilesmile  ! думаю тему можно закрыть! лентяй я  smile ! нужно будет все описывать!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)