elanc

Работа с динамическими объектами

Вопрос

Как создать экземпляр объекта так, чтобы он не был уничтожен после выхода из функции?

 

Как пример, такой псевдокод…

class MyData {
  int value;
  
  void MyData( int value = 0 ) {
    this.value = value;
  }
  
  void ~MyData() {
    Error( "I WAS KILLED!!!" );
  }
  
}
typedef ref MyData TMyData;
typedef ref map<string, TMyData> TMyList;

class MyList {
  ref TMyList list;
  
  void MyList() {
    list = new TMyList;
  }
  
  void ~MyList() {
    list.Clear();
    delete list;
  }
  
  void PrintAll() {
    int i;
    string key;
    ref TMyData value;
    int count = list.Count();
    for( i = 0; i < count; i++ ) {
      key = list.GetKey( i );
      value = list.GetElement( i );
      if( !value ) {
        Print( "Key " + key + " hasn't value." );
        continue;
      }
      Print( key + " has value " + value.value );
    }
  }
  
}

MyList g_list = new MyList;

class SomewhereElse {
  
  void SomewhereElse() {
  	MyFunc();
  }
  
  void ~SomewhereElse() {
  }
  
  void AddElement( int i, string key ) {
    ref TMyData data;
    data = new TMyData( i );
    g_list.list.Insert( key, data );
  }
  
  void MyFunc() {
    AddElement(1, "alpha");
    AddElement(2, "beta");
    AddElement(3, "delta");
    g_list.PrintAll();	
  }

}

Короче, видно, что сразу после вызова метода AddElement() созданный экземпляр объекта класса TMyData уничтожается…

Короче, у меня, как у программиста, от этого пригорает! Как тут-то это делать нужно?!

 

P.S. И всё-таки нам нужен чатик!

P.P.S. Нормальный, а «привет, нулевые» в виде веб-чата, как «плюшки» для форума…

P.P.P.S. — Все в телегу, товарищи!

Изменено пользователем elanc (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

3 ответа на этот вопрос

ref TMyData data в теле функции

а если вынести в тело класса?

 

ну и как бы

 

Can't compile mission init script'!

$CurrentDir://mpmissions//dayzOffline.chernarusplus//_MODS//TestClass.c(20): Variable 'list' is not strong ref (missing 'ref'?) !

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


class CustomData
    {
        private int value    =    0;
        void SetValue(int v_value)
            {value    =    v_value;}
        int GetValue()
            {return value;}
    }

class CustomMap
    {
        ref map<string, ref MyData> aCustomData    =    new map<string, ref MyData>;
        void CustomMap()
            {
                CustomData    v_CustomData;
                aCustomData.Insert("test1", new CustomData);
                aCustomData.Insert("test2", new CustomData);
                aCustomData.Insert("test3", new CustomData);
                
                v_CustomData    =    new CustomData;
                v_CustomData.SetValue(10);
                
                aCustomData.Insert("test4", v_CustomData);
            }
    }


    
.....

CustomData    v_CustomData;
CustomMap    v_CustomMap    =    new CustomMap();
v_CustomData    =    v_CustomMap.aCustomData.Find("test1");
if (v_CustomData)
    {Print(v_CustomData.GetValue);};
v_CustomData    =    v_CustomMap.aCustomData.Find("test4");
if (v_CustomData)
    {Print(v_CustomData.GetValue);};


    
Еще вариант, без объявления создать static

class CustomMap
    {
        static ref map<string, ref MyData> aCustomData    =    new map<string, ref MyData>;
        static void CustomMapCreate()
            {
                CustomData    v_CustomData;
                CustomMap.aCustomData.Insert("test1", new CustomData);
                CustomMap.aCustomData.Insert("test2", new CustomData);
                CustomMap.aCustomData.Insert("test3", new CustomData);
                
                v_CustomData    =    new CustomData;
                v_CustomData.SetValue(10);
                
                CustomMap.aCustomData.Insert("test4", v_CustomData);
            }
    }


    
.......
 

CustomData    v_CustomData;
CustomMap.CustomMapCreate();

v_CustomData    =    CustomMap.aCustomData.Find("test1");
if (v_CustomData)
    {Print(v_CustomData.GetValue);};
v_CustomData    =    CustomMap.aCustomData.Find("test4");
if (v_CustomData)
    {Print(v_CustomData.GetValue);};
    
Print( string.Format("значение 3го элемента: %1", CustomMap.aCustomData.Get(3).GetValue()) );

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

P.S. Там где то скобки пропустил в GetValue... GetValue()

Ну и можно и с конструктором в принципе, если он так нужен. - Без разницы в целом.

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас