Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • OPG PROJECT

    Группа ВК

    По-настоящему хороший сервер с уникальным модом! 
     Заходи к нам,тебе тут понравится!
  • 0
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. — Все в телегу, товарищи!

Edited by elanc (see edit history)

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

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'?) !

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites



  • 0
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()) );

 

Share this post


Link to post
Share on other sites
  • 0

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

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

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.