关于OOP(面向对象的编程)的问题 - 页 11 1...4567891011 新评论 Viktar Dzemikhau 2014.08.10 16:46 #101 我想听听更多有经验的程序员对其中一些细微差别的看法。以类中变量的声明 为例。例如,我在类中有一些变量,这些变量被声明在某个类的不同方法中。它们在每个方法中最常被声明。值得这样做吗?还是在私人 部分声明一次后再使用更好?我想,如果在循环中使用计数器变量,会更符合逻辑,对吗?毕竟,在计算的时候,计数器被明确地设置为一个值,例如,如果我们使用一个循环。for (i = OrdersTotal() - 1; i >= 0; i--) { }在每个方法中,声明一个变量i 是不合理的,因为这可能是对内存单元的不必要的浪费。一般来说,我对这种事情感兴趣。这不仅涉及循环,还涉及其他选择。有足够多的不同的变量必须被多次声明,但它们发挥着同样的作用......我唯一能看到的是,其中一些将不得不在价值上归零,以便它们不包含以前操作的 "垃圾"。这样做是否合理,还是重新声明这样的变量更容易...一般来说,我希望听到专业人士的介绍。 [删除] 2014.08.10 18:58 #102 hoz:我想听听更多有经验的程序员对其中一些细微差别的看法。以类中变量的声明为例。例如,我在类中有一些变量,这些变量被声明在某个类的不同方法中。它们在每个方法中最常被声明。值得这样做吗?还是在私人 部分声明一次后再使用更好?我想,如果在循环中使用计数器变量,会更符合逻辑,对吗?毕竟,在计算的时候,计数器被明确地设置为一个值,例如,如果我们使用一个循环。在每个方法中,声明一个变量i 是不合理的,因为这可能是对内存单元的不必要的浪费。一般来说,我对这种事情感兴趣。这不仅涉及循环,还涉及其他选择。有足够多的不同的变量必须被多次声明,但它们发挥着同样的作用......我唯一能看到的是,其中一些将不得不在价值上归零,以便它们不包含以前操作的 "垃圾"。这样做是否合理,还是重新声明这样的变量更容易...一般来说,我希望听到专业人士的介绍。你是否应该这样做,取决于创建变量的目的。如果一个实体被一个类所封装,例如一个订单,那么我们将需要在类中定义变量来表达其属性,例如订单的票据。这些变量将被该类的所有方法共享,用于该类中的同一个对象。如果创建一个变量是为了在方法中提供一个循环,它应该在方法中被定义为自动的(即不使用静态关键字)。在这种情况下,即使一个方法在自己的循环中调用另一个方法,而这个方法也有一个循环,并且使用了同名的变量,你也不会有任何问题。当使用一个在类中声明的变量时,该变量将在第二个方法的循环中被改写。对于自动变量,在进入函数时自动分配内存,退出时自动删除,开销最小。此外,如果函数很简单,编译器可以生成完全不分配和释放自动内存的代码。保存这种存储单元在一段时间前曾经是一件明智的事情,但大约在20年前,它终于失去了意义...... Viktar Dzemikhau 2014.08.17 14:53 #103 有一个班级。它有这样一个简单的方法,都是没有品牌的地狱,因为我在寻找错误所在。// 1.5 Определяем минимальную разрядность лота. =========================================================================================== int BaseInfo::LotPrecision() { static int li_LotPrecision = 0; // устанавливаем минимальную разрядность лота в ноль Print ("LotPrecision()_Before: li_LotPrecision = ", li_LotPrecision); Print ("LotPrecision()_BeforeCircle: SLots.gd_LotStep = ", SLots.gd_LotStep); while (SLots.gd_LotStep < 1) { Print ("LotPrecision(): SLots.gd_LotStep < 1"); SLots.gd_LotStep *= 10; Print ("SLots.gd_LotStep *= 10"); Print ("LotPrecision(): SLots.gd_LotStep = ", SLots.gd_LotStep); li_LotPrecision++; Print ("LotPrecision(): li_LotPrecision = ", li_LotPrecision); } Print ("LotPrecision(): LOTPRES = ", li_LotPrecision); return (li_LotPrecision); }变量li_LotPrecision 以前是没有静态 修改器的,后来我看到它不应该失去价值,就把它改了。人们注意到,即使我添加了修改器,li_LotPrecision变量 也没有保留其值。我把它打印到OnInite()。void OnTick() { int Lot = CBase.LotPrecision(); Print ("Lot = ", Lot); }在日志中。17:26:03 2014.07.22 14:10 RSI EURUSD,M5: SLots.gd_LotStep = MarketInfo (_Symbol, MODE_LOTSTEP); = 0.01 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 0.01 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: SLots.gd_LotStep *= 10 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 0.1 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 1 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: SLots.gd_LotStep *= 10 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 1.0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 2 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): LOTPRES = 2 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): LOTPRES = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: Lot = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision(): LOTPRES = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: Lot = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0 17:26:03 2014.07.22 14:10 RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0这清楚地表明,在退出LotPrecision() 函数后,li_LotPrecision 变量的值会丢失。如何使其保持恒定?我试着把这个li_LotPrecision 变量添加到私有 类部分,以便以后把它分配给静态 修改器,但编译器坚持认为这是不可能的。unresolved static variable 'BaseInfo::li_LotPrecision' BaseInfo.mqh 60 10 把这个变量扔出类是没有意义的,因为其他地方不需要它。该怎么做? 1...4567891011 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我想听听更多有经验的程序员对其中一些细微差别的看法。以类中变量的声明 为例。例如,我在类中有一些变量,这些变量被声明在某个类的不同方法中。它们在每个方法中最常被声明。值得这样做吗?还是在私人 部分声明一次后再使用更好?
我想,如果在循环中使用计数器变量,会更符合逻辑,对吗?毕竟,在计算的时候,计数器被明确地设置为一个值,例如,如果我们使用一个循环。
在每个方法中,声明一个变量i 是不合理的,因为这可能是对内存单元的不必要的浪费。一般来说,我对这种事情感兴趣。
这不仅涉及循环,还涉及其他选择。有足够多的不同的变量必须被多次声明,但它们发挥着同样的作用......我唯一能看到的是,其中一些将不得不在价值上归零,以便它们不包含以前操作的 "垃圾"。这样做是否合理,还是重新声明这样的变量更容易...一般来说,我希望听到专业人士的介绍。
我想听听更多有经验的程序员对其中一些细微差别的看法。以类中变量的声明为例。例如,我在类中有一些变量,这些变量被声明在某个类的不同方法中。它们在每个方法中最常被声明。值得这样做吗?还是在私人 部分声明一次后再使用更好?
我想,如果在循环中使用计数器变量,会更符合逻辑,对吗?毕竟,在计算的时候,计数器被明确地设置为一个值,例如,如果我们使用一个循环。
在每个方法中,声明一个变量i 是不合理的,因为这可能是对内存单元的不必要的浪费。一般来说,我对这种事情感兴趣。
这不仅涉及循环,还涉及其他选择。有足够多的不同的变量必须被多次声明,但它们发挥着同样的作用......我唯一能看到的是,其中一些将不得不在价值上归零,以便它们不包含以前操作的 "垃圾"。这样做是否合理,还是重新声明这样的变量更容易...一般来说,我希望听到专业人士的介绍。
你是否应该这样做,取决于创建变量的目的。如果一个实体被一个类所封装,例如一个订单,那么我们将需要在类中定义变量来表达其属性,例如订单的票据。这些变量将被该类的所有方法共享,用于该类中的同一个对象。
如果创建一个变量是为了在方法中提供一个循环,它应该在方法中被定义为自动的(即不使用静态关键字)。在这种情况下,即使一个方法在自己的循环中调用另一个方法,而这个方法也有一个循环,并且使用了同名的变量,你也不会有任何问题。当使用一个在类中声明的变量时,该变量将在第二个方法的循环中被改写。
对于自动变量,在进入函数时自动分配内存,退出时自动删除,开销最小。此外,如果函数很简单,编译器可以生成完全不分配和释放自动内存的代码。
保存这种存储单元在一段时间前曾经是一件明智的事情,但大约在20年前,它终于失去了意义......
有一个班级。它有这样一个简单的方法,都是没有品牌的地狱,因为我在寻找错误所在。
变量li_LotPrecision 以前是没有静态 修改器的,后来我看到它不应该失去价值,就把它改了。人们注意到,即使我添加了修改器,li_LotPrecision变量 也没有保留其值。
我把它打印到OnInite()。
在日志中。
这清楚地表明,在退出LotPrecision() 函数后,li_LotPrecision 变量的值会丢失。如何使其保持恒定?
我试着把这个li_LotPrecision 变量添加到私有 类部分,以便以后把它分配给静态 修改器,但编译器坚持认为这是不可能的。
把这个变量扔出类是没有意义的,因为其他地方不需要它。
该怎么做?