错误、漏洞、问题 - 页 1951

 
Stanislav Korotky:

有没有办法从一个函数中返回一个匿名的对象实例?

用一个宏来取代它。
 
fxsaber:
用一个宏来取代它。

这是不可能的。这是一个类方法,参数实际上取自对象。我在这里对其进行了简化,比如说。

 
Stanislav Korotky:

这是不可能的。这是一个类方法,参数实际上取自对象。我在这里对其进行了简化,比如说。

当然,你最好熟悉一下原来的任务...

返回一个指针会不会是错的?

 

Stanislav Korotky:

它可以工作,除了它创建了一个额外的内部拷贝,而且返回语句要求在类中有一个拷贝构造器虽然在函数退出时,复制被钉住了,但我想消除复制本身。


Class function()
{
  int param = 0;
  Class obj(param);
  return obj;
}

当然是这样,局部变量在函数退出时被销毁。
使用new并返回指针,有什么问题吗?

如果你需要资源控制,请使用智能指针这样的包装器。
也许你可以使用 "创造模式 "中的一些东西,比如singleton或builder...。

 
fxsaber:

当然,最好是熟悉一下原来的任务......

返回指针会不会是错的?

这原本是在指针上。但这样一来,客户端的代码就要负责删除它们,这就是很多垃圾,更不用说它只需要一眨眼的时间,你就会留下暂停的链接。

 
Sergey Dzyublik:

当然,在退出函数后,局部变量被销毁。

使用new并返回一个指针,有什么问题吗?

如果你需要资源控制,请使用智能指针这样的包装器。
也许像singleton或builder这样来自Creational Patterns的东西会对你有用。

指针就在那里--不方便(上文已回答)。我试着向 "聪明 "看齐。但我的印象是,对于MQL来说,智能指针只会提供另一个层次的参考性,这需要反过来进行监控。毕竟,什么是智能指针?- 它是一个包装对象,初始引用被放在其中。还有,谁和什么时候来清理包装纸?;-)如果你有现成的解决方案,请给我留言。我现在有一个测试案例。

 
Stanislav Korotky:

毕竟,什么是智能指针?- 它是一个包装对象,原始引用被放置在其中。那么谁和什么时候来清理包装纸呢?;-)如果你有现成的解决方案,请给我留言。我现在有一个测试案例。


使用shared_ptr。
你不需要清理这个包装器,你只需要复制它,shared_ptr是指还剩下多少个所需资源的实例,以及何时释放这个或那个资源。


没有现成的解决方案,至少对我来说是如此。适应C++的。

 
Sergey Dzyublik:

没有现成的解决方案,至少对我来说没有。适应C++的。

这是可以理解的--我就是这样做的,但已经有一种印象,即MQL不允许你做 "追踪"。

 
Stanislav Korotky:

有没有办法从一个函数中返回一个匿名的对象实例?

正如有人已经在这里指出的那样,最正确的方法是从一个函数中返回一个智能指针。所有这些都是在MQL中实现的。虽然在C++中使用起来不那么方便,因为指针传递应该通过方法实现,而不是通过传递操作符。顺便说一下,对于手头的任务,我想shared_ptr是没有必要的,unique_ptr就足够了。

另外,在函数中创建的指针可以立即被放在某个全局数组中,在程序结束时被扔掉。同时,用户可以在任何时候通过调用一个特殊的函数(不是删除)来释放该对象的内存。这就像WinApi中的CloseHandle。

它是有效的,除了创建了一个额外的内部拷贝,而且返回操作符 需要在类中有一个拷贝构造器。虽然在函数退出时,拷贝被钉住了,但我想消除拷贝本身。

也许编译器足够聪明,可以自行优化和内联所有的东西,排除不必要的复制。但我们必须检查一下。如果有人能进行测试和测量,那就更好了。因为我经常发现自己也面临这样的困境。

 
Alexey Navoykov:

正如有人已经指出的那样,正确的方法是从一个函数中返回一个智能指针。所有这些都是在MQL中实现的。但它的使用并不像C++那样方便,因为指针切换必须通过方法实现,而不是通过切换操作符。顺便说一下,对于手头的任务,我想shared_ptr是没有必要的,unique_ptr就足够了。

另外,在函数中创建的指针可以立即被放在某个全局数组中,在程序结束时被扔掉。同时,用户可以在任何时候通过调用一个特殊的函数(不是删除)来释放该对象的内存。这就像WinApi中的CloseHandle。

也许编译器足够聪明,可以优化所有的东西,并自行内联,消除不必要的复制。但我们必须检查一下。如果有人能进行测试和测量,那就更好了。否则我也经常发现自己面临这样的困境。

我在下面公布我的实现--反正这些智能点是临时创建的,结果我只是创建和钉住了比我更多的对象;--)。

当然,我想到了一个全局数组的变种,但它太难看了!"。特别是因为我想通过定时器来清理(因为程序可能会运行好几天),而MQL中的定时器不能附加到一个类/对象上--它只来自全局处理程序。

编译器在这里没有帮助--经过测试--通过返回的本地对象被复制,然后被钉住。在这种情况下,不存在最佳的行动。

template<typename T>
class auto_ptr
{
  private:

    class Reference
    {
      public:
        int count;
        Reference(): count(0) {}
    };

    T *data;
    Reference *reference;

    void remove()
    {
      if(reference != NULL)
      {
        reference.count--;
        if(reference.count == 0)
        {
          delete data;
          delete reference;
        }
      }
    }

    
  public:
    auto_ptr(): data(NULL), reference(NULL)
    {
    }
    auto_ptr(T *ptr): data(ptr), reference(ptr == NULL ? NULL : new Reference())
    {
      if(reference != NULL) reference.count++;
    }
    auto_ptr(auto_ptr<T> &ref): data(ref.data), reference(ref.reference)
    {
      reference.count++;
    }
    
    ~auto_ptr()
    {
      remove();
    }
    
    void operator=(auto_ptr<T> &next)
    {
      if(&this != &next)
      {
        remove();
        
        data = next.data;
        reference = next.reference;
        reference.count++;
      }
    }
};