对MT5的祝愿 - 页 103

 
A100:

ME5在编译时出现了一个错误,在我看来是不应该的。


有道理--会的。
 

我想让ENUM_XXX形式的预定义枚举实际编号为1,而目前是默认编号,即0。 问题不是要改变默认值,而是要替换掉

enum ENUM_ORDER_TYPE {
        ORDER_TYPE_BUY,
        ORDER_TYPE_SELL, ...
};

它应该是

enum ENUM_ORDER_TYPE {
        ORDER_TYPE_BUY = 1,
        ORDER_TYPE_SELL, ...
};

推理如下--一个例子。

MqlTradeRequest request { ...
        ENUM_ORDER_TYPE     type; ...
}

当我在代码的某个地方分析request.type的值时,如果它等于0,我就不能理解它是没有被初始化还是被初始化了。

request.type = ORDER_TYPE_BUY;

大多数预定义的ENUM_ XXX形式的枚举都是这种情况,相当于RadioButton,需要不合理的复杂性 来正确处理目前的情况

 
不幸的是,由于要保持与其他语言的兼容性,这是不可能的,因为这些语言的编号是从头开始的。
 
Renat: 不幸的是,由于要保持与其他语言的兼容性,这是不可能的,因为其他语言的编号是从零开始的。

是什么阻止了你把一个中性标识符写成预定义枚举的第一个成员?比如说。

enum ENUM_ORDER_TYPE 
  {
   ORDER_TYPE_undefined,
   ORDER_TYPE_BUY,
   ORDER_TYPE_SELL, 
   ...
  };

两个 "从零开始的编号 "将被保留,未初始化的变量可以很容易地被评估。

 
Yedelkin:

是什么阻止了你把一个中性标识符写成预定义枚举的第一个成员?比如说。

如果你想想其他人已经在使用原来的一组枚举?这就更不用说整个服务器群的疑惑眼神了。

一般来说,这个问题的提出是不正确的。开发商不应该偷懒,通过自毁这个世界来迫使世界其他地方适应自己。

 
Renat: 如果你想想其他人已经在使用原来的一组枚举?

好吧,让我们再想想,"关于其他人"。命名的常量 标识符是用来做什么的?- 正确,以便使用这些标识符。此外,为了使用这些标识符,你并不绝对需要知道给枚举成员 分配的具体数值。还是你认为有能力的程序员会使用标识符而不是找出枚举成员的 默认值,然后根据这些默认值进行检查?

雷纳特 :这就更不用说整个服务器群的令人困惑的观点了。

也就是说,实施建议本身并不难,是吗?

雷纳特 :实际上这个问题提得不对。开发者不应该偷懒,通过自我毁灭这个世界来迫使世界上的其他人适应自己。

这个主题的作者并不打算通过他的懒惰来破坏其他人的世界。他只是提出了一个具体的改进建议。并解释说,零值原来是过载的。

 

我想至少引入一个类作为枚举命名元素的范围。

void test1() { enum ENUM_1 { ELEM1 }; }
void test2() { enum ENUM_2 { ELEM1 }; } //ошибка

class A {
        enum ENUM_A { ELEM1 };
};
class B {
        enum ENUM_B { ELEM1 }; //ошибка
};

类的理由:你必须想出一个独特的名字,可能会意外地与库(包括第三方)和/或预定义的名字冲突。此外,你可以在几个类中同时使用类似的SL、TP、PRICE等枚举元素的名称,而不必担心冲突。

职能的理由:不是关键,但同时也是

 
A100:

我们希望为枚举命名的元素引入一个范围

类的理由:你必须想出一个独特的名字,可能会意外地与库和/或预定义的名字冲突。另外,你可以在几个类中同时为SL、TP、PRICE等枚举元素使用类似的名称,而不必担心冲突。

职能的理由:不是关键,但同时也是

这在C++中是什么情况?
 
sergeev:
但在C++中是怎样的呢?

这就是腿的来源--一个悖论,但直到现在(有限制的时候),我才开始明白为什么一切都在那里完成:)

当然,你可以不这样做--为所有的类写一个唯一的名字,但对于大型程序,特别是用于一般使用的库来说,这不是一个选项。

 
A100: 我希望预定义的ENUM_XXX形式的枚举实际上相当于RadioButton的编号为1,而现在它们的默认编号为0。问题不在于改变默认值,而在于...

试试这个(用于 "初始化")。

错误的值。

一个常数可以隐含地 转换为任何枚举 类型。

-1