如何在MQL中从方法返回一个对象或结构体?

3
struct Person {         
      string FirstName;
      string LastName;
};

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

当我编译时,会出现以下错误:

'return' - 结构体包含对象,无法复制。

我只需要创建一个结构体或类对象并返回它,我不想做任何复制.

我试过使用&和*的组合,但没有成功。我尝试使用类而不是结构体,但也没用。

我还尝试了以下示例:

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);
  }

在运行时,在OnInit()方法中访问person.FirstName时,它会给我一个无效指针访问

4个回答

3

找到答案了,但如何避免内存泄漏?使用后如何销毁对象及其指针?

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;

1
首先,你需要在代码中有一个默认构造函数和拷贝构造函数。其次,你需要将结构体初始化为默认值,结构体只分配内存空间而不进行初始化,因此可能会出现像“-1823834393939”这样奇怪的长整型变量值的情况,所以总是将结构体设置为默认值。
然后,当你从函数返回一个类或结构体时,拷贝构造函数将被调用来复制值。因此,如果你不想返回你在类中创建的确切对象,你就不需要返回引用。
struct Person
{
    string FirstName;
    string LastName;
    Person()
    {
        FirstName = "";
        LastName = "";
    }
    Person(Person &that)
    {
        FirstName = that.FirstName;
        LastName = that.LastName;
    }
};

class Builder
{
public:
    Person Builder::Build(string argFirstname, string argLastName)
    {
        Person person;
        person.FirstName = argFirstname;
        person.LastName = argLastName;
        return person;
    };
};

void OnStart()
{
    Builder b;
    Person p = b.Build("Mohammad Hossein", "amri");
    Print(p.FirstName + " " + p.LastName);
}

输出将会是

enter image description here


0

你不应该删除静态对象 - 否则编译器会在打印区域显示“删除无效指针”消息... 因此,检查应该像Daniel Kniaz回答的那样进行... 但是,当你在包装器内部创建对象时,最好在其包装器的析构函数中进行删除检查和删除(尽管我怀疑,在这里你真的应该使用另一个类来创建CPerson - 你可以在其 - CPerson的构造函数中创建其对象)


0

你可以通过delete(person);来删除对象,如果你不确定对象是否为空,最好先检查if(CheckPointer(object)==POINTER_DYNAMIC)delete(object);

总体而言,你应该将所有这些对象作为变量,并赋予相应的变量名,或者将它们全部放在一个集合中,在程序结束时销毁整个集合。你也可以在程序开始之前(OnInit之前),创建对象的全局变量,并在程序结束时删除它。

关于最初的问题 - 你不能在结构体内部使用字符串,只能使用基本类型。


我们应该在什么时候删除它?在销毁对象的方法中吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接