Как вернуть объект или структуру из метода в MQL? - PullRequest
0 голосов
/ 10 ноября 2018
struct Person {         
      string FirstName;
      string LastName;
};

class Builder {   
   public:      
   Person Builder::Build() {
      Person person;
      person.FirstName = "FirstName";
      person.LastName = "LastName";
      return person;   
   };  
};

Когда я компилирую это, я получаю следующую ошибку:

'return' - структура имеет объекты и не может быть скопирована.

Мне просто нужно создать объект структуры или класса и вернуть его, я не хочу копировать.

Я пытался использовать комбинации & и *, но не работал. Я попытался использовать класс вместо struct, и он тоже не сработал.

Я также пробовал с классом, как показано ниже:

class Person {   
   public:      
      string FirstName;
      string LastName;
};

class Builder {   
   public:      
   Person* Build() {
      Person person;
      person.FirstName = "FirstName";
      person.LastName = "LastName";
      return &person;   
   };  
};
int OnInit()
  {  

   Builder builder;
   Person* person = builder.Build();
   string firstName = person.FirstName;
   return(INIT_SUCCEEDED);
  }

И это дает мне недопустимый указатель доступа при доступе к person.FirstName в методе OnInit () во время выполнения.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вы можете удалить объект с помощью delete(person);, и если вы не уверены, что объект не является нулевым, лучше проверить if(CheckPointer(object)==POINTER_DYNAMIC)delete(object);

В целом, вы должны иметь все такие объекты как переменные с соответствующими именами переменных или хранить их все в коллекции и уничтожать всю коллекцию в конце. Вы также можете создать глобальную переменную объекта (до OnInit, а не внутри какой-либо функции), и она должна быть удалена в конце программы.

Относительно первоначального вопроса - внутри структуры не может быть строки, только примитивы

0 голосов
/ 10 ноября 2018

Нашел ответ, но как избежать утечки памяти? как уничтожить объект и его указатель после использования?

class cPerson {   
      public:      
         string FirstName;
         string LastName;
   };

   class cBuilder {   
      public:      
      cPerson* Build() {
         cPerson* person = new cPerson();
         person.FirstName = "firstname";
         return person;   
      };  
   };
cBuilder builder;
   cPerson* person = builder.Build();
   string age = person.FirstName;
...