错误、漏洞、问题 - 页 1951 1...194419451946194719481949195019511952195319541955195619571958...3184 新评论 fxsaber 2017.08.04 13:51 #19501 Stanislav Korotky:有没有办法从一个函数中返回一个匿名的对象实例? 用一个宏来取代它。 Stanislav Korotky 2017.08.04 14:07 #19502 fxsaber: 用一个宏来取代它。这是不可能的。这是一个类方法,参数实际上取自对象。我在这里对其进行了简化,比如说。 fxsaber 2017.08.04 14:12 #19503 Stanislav Korotky:这是不可能的。这是一个类方法,参数实际上取自对象。我在这里对其进行了简化,比如说。当然,你最好熟悉一下原来的任务...返回一个指针会不会是错的? Sergey Dzyublik 2017.08.04 14:17 #19504 Stanislav Korotky:它可以工作,除了它创建了一个额外的内部拷贝,而且返回语句要求在类中有一个拷贝构造器。虽然在函数退出时,复制被钉住了,但我想消除复制本身。Class function() { int param = 0; Class obj(param); return obj; }当然是这样,局部变量在函数退出时被销毁。 使用new并返回指针,有什么问题吗? 如果你需要资源控制,请使用智能指针这样的包装器。 也许你可以使用 "创造模式 "中的一些东西,比如singleton或builder...。 Stanislav Korotky 2017.08.04 14:23 #19505 fxsaber:当然,最好是熟悉一下原来的任务......返回指针会不会是错的?这原本是在指针上。但这样一来,客户端的代码就要负责删除它们,这就是很多垃圾,更不用说它只需要一眨眼的时间,你就会留下暂停的链接。 Stanislav Korotky 2017.08.04 14:34 #19506 Sergey Dzyublik:当然,在退出函数后,局部变量被销毁。使用new并返回一个指针,有什么问题吗? 如果你需要资源控制,请使用智能指针这样的包装器。 也许像singleton或builder这样来自Creational Patterns的东西会对你有用。指针就在那里--不方便(上文已回答)。我试着向 "聪明 "看齐。但我的印象是,对于MQL来说,智能指针只会提供另一个层次的参考性,这需要反过来进行监控。毕竟,什么是智能指针?- 它是一个包装对象,初始引用被放在其中。还有,谁和什么时候来清理包装纸?;-)如果你有现成的解决方案,请给我留言。我现在有一个测试案例。 Sergey Dzyublik 2017.08.04 14:45 #19507 Stanislav Korotky:毕竟,什么是智能指针?- 它是一个包装对象,原始引用被放置在其中。那么谁和什么时候来清理包装纸呢?;-)如果你有现成的解决方案,请给我留言。我现在有一个测试案例。使用shared_ptr。 你不需要清理这个包装器,你只需要复制它,shared_ptr是指还剩下多少个所需资源的实例,以及何时释放这个或那个资源。 没有现成的解决方案,至少对我来说是如此。适应C++的。 Stanislav Korotky 2017.08.04 15:00 #19508 Sergey Dzyublik: 没有现成的解决方案,至少对我来说没有。适应C++的。这是可以理解的--我就是这样做的,但已经有一种印象,即MQL不允许你做 "追踪"。 Alexey Navoykov 2017.08.04 16:28 #19509 Stanislav Korotky:有没有办法从一个函数中返回一个匿名的对象实例?正如有人已经在这里指出的那样,最正确的方法是从一个函数中返回一个智能指针。所有这些都是在MQL中实现的。虽然在C++中使用起来不那么方便,因为指针传递应该通过方法实现,而不是通过传递操作符。顺便说一下,对于手头的任务,我想shared_ptr是没有必要的,unique_ptr就足够了。另外,在函数中创建的指针可以立即被放在某个全局数组中,在程序结束时被扔掉。同时,用户可以在任何时候通过调用一个特殊的函数(不是删除)来释放该对象的内存。这就像WinApi中的CloseHandle。它是有效的,除了创建了一个额外的内部拷贝,而且返回操作符 需要在类中有一个拷贝构造器。虽然在函数退出时,拷贝被钉住了,但我想消除拷贝本身。也许编译器足够聪明,可以自行优化和内联所有的东西,排除不必要的复制。但我们必须检查一下。如果有人能进行测试和测量,那就更好了。因为我经常发现自己也面临这样的困境。 Stanislav Korotky 2017.08.04 16:57 #19510 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++; } } }; 1...194419451946194719481949195019511952195319541955195619571958...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
有没有办法从一个函数中返回一个匿名的对象实例?
用一个宏来取代它。
这是不可能的。这是一个类方法,参数实际上取自对象。我在这里对其进行了简化,比如说。
这是不可能的。这是一个类方法,参数实际上取自对象。我在这里对其进行了简化,比如说。
当然,你最好熟悉一下原来的任务...
返回一个指针会不会是错的?
Stanislav Korotky:
它可以工作,除了它创建了一个额外的内部拷贝,而且返回语句要求在类中有一个拷贝构造器。虽然在函数退出时,复制被钉住了,但我想消除复制本身。
当然是这样,局部变量在函数退出时被销毁。
使用new并返回指针,有什么问题吗?
如果你需要资源控制,请使用智能指针这样的包装器。
也许你可以使用 "创造模式 "中的一些东西,比如singleton或builder...。
当然,最好是熟悉一下原来的任务......
返回指针会不会是错的?
这原本是在指针上。但这样一来,客户端的代码就要负责删除它们,这就是很多垃圾,更不用说它只需要一眨眼的时间,你就会留下暂停的链接。
当然,在退出函数后,局部变量被销毁。
使用new并返回一个指针,有什么问题吗?
如果你需要资源控制,请使用智能指针这样的包装器。
也许像singleton或builder这样来自Creational Patterns的东西会对你有用。
指针就在那里--不方便(上文已回答)。我试着向 "聪明 "看齐。但我的印象是,对于MQL来说,智能指针只会提供另一个层次的参考性,这需要反过来进行监控。毕竟,什么是智能指针?- 它是一个包装对象,初始引用被放在其中。还有,谁和什么时候来清理包装纸?;-)如果你有现成的解决方案,请给我留言。我现在有一个测试案例。
毕竟,什么是智能指针?- 它是一个包装对象,原始引用被放置在其中。那么谁和什么时候来清理包装纸呢?;-)如果你有现成的解决方案,请给我留言。我现在有一个测试案例。
使用shared_ptr。
你不需要清理这个包装器,你只需要复制它,shared_ptr是指还剩下多少个所需资源的实例,以及何时释放这个或那个资源。
没有现成的解决方案,至少对我来说是如此。适应C++的。
没有现成的解决方案,至少对我来说没有。适应C++的。
这是可以理解的--我就是这样做的,但已经有一种印象,即MQL不允许你做 "追踪"。
有没有办法从一个函数中返回一个匿名的对象实例?
正如有人已经在这里指出的那样,最正确的方法是从一个函数中返回一个智能指针。所有这些都是在MQL中实现的。虽然在C++中使用起来不那么方便,因为指针传递应该通过方法实现,而不是通过传递操作符。顺便说一下,对于手头的任务,我想shared_ptr是没有必要的,unique_ptr就足够了。
另外,在函数中创建的指针可以立即被放在某个全局数组中,在程序结束时被扔掉。同时,用户可以在任何时候通过调用一个特殊的函数(不是删除)来释放该对象的内存。这就像WinApi中的CloseHandle。
它是有效的,除了创建了一个额外的内部拷贝,而且返回操作符 需要在类中有一个拷贝构造器。虽然在函数退出时,拷贝被钉住了,但我想消除拷贝本身。
也许编译器足够聪明,可以自行优化和内联所有的东西,排除不必要的复制。但我们必须检查一下。如果有人能进行测试和测量,那就更好了。因为我经常发现自己也面临这样的困境。
正如有人已经指出的那样,正确的方法是从一个函数中返回一个智能指针。所有这些都是在MQL中实现的。但它的使用并不像C++那样方便,因为指针切换必须通过方法实现,而不是通过切换操作符。顺便说一下,对于手头的任务,我想shared_ptr是没有必要的,unique_ptr就足够了。
另外,在函数中创建的指针可以立即被放在某个全局数组中,在程序结束时被扔掉。同时,用户可以在任何时候通过调用一个特殊的函数(不是删除)来释放该对象的内存。这就像WinApi中的CloseHandle。
也许编译器足够聪明,可以优化所有的东西,并自行内联,消除不必要的复制。但我们必须检查一下。如果有人能进行测试和测量,那就更好了。否则我也经常发现自己面临这样的困境。
我在下面公布我的实现--反正这些智能点是临时创建的,结果我只是创建和钉住了比我更多的对象;--)。
当然,我想到了一个全局数组的变种,但它太难看了!"。特别是因为我想通过定时器来清理(因为程序可能会运行好几天),而MQL中的定时器不能附加到一个类/对象上--它只来自全局处理程序。
编译器在这里没有帮助--经过测试--通过返回的本地对象被复制,然后被钉住。在这种情况下,不存在最佳的行动。