MQL5中的OOP问题 - 页 60

 
Igor Makanu:

又见面了!


这个问题,有一个枚举,我们需要一个数组枚举或一个列表枚举或一个容器枚举--可以存储7个枚举的东西,但胃口越来越大,也许是70个枚举。


在哪里?

根据任务,数组和列表以及容器都可以做。按照我的理解,很可能你需要简化代码编写,那么你可以把枚举分成几组,然后把它们组合成每个对象的参数的结构。

如果我们谈论的是执行阶段,我认为只有在指定值/对时使用枚举是正常的做法。而为了存储它们,使用一个简单的基础类型。

 
Aleksey Mavrin:

你可以做一个数组、一个列表和一个容器,这取决于任务。按照我的理解,你可能需要简化代码编写,然后你可以把枚举分成几组,并把它们组合成每个对象的参数的结构。

如果我们谈论的是执行阶段,我认为只有在指定值/对时使用枚举是正常的做法。而为了存储它们,使用一个简单的基础类型。

起初是这样做的,但由于某些原因我放弃了,似乎在初始化这些字段时有问题,或者说在某些构建中ME中枚举的自动完成变体有问题,也许是由于另一个注入器中的部分代码是....。让我们研究一下这个选项。


在互联网上冲浪,我想要像这样的夏普产品......一些属性(()。

 public class COrder
    {
        public enum E_MOTION { HIGHER, LOWER, ZIGZAG }
        public enum E_VOLUME { FIXED, INC, DEC }
        public E_MOTION OrderMotionType { get; set; }
        public E_VOLUME OrderVolumeType { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var current = new COrder { OrderMotionType = COrder.E_MOTION.HIGHER, OrderVolumeType = COrder.E_VOLUME.FIXED };
            
        }
    }
 
Igor Makanu:

起初是这样做的,但由于某些原因我放弃了,似乎在初始化这些字段时有问题,或者说在某些构建中ME的枚举变体的自动替换有问题,可能是因为另一个注入器中的部分代码是....。让我们研究一下这个选项。


在互联网上冲浪,我想要像这样的夏普产品......某种属性(()

有什么问题呢?

如果是一对一的,那么。

class COrder
{
public:
   enum E_MOTION { HIGHER, LOWER, ZIGZAG };
   enum E_VOLUME { FIXED, INC, DEC };
   E_MOTION orderMotionType;
   E_VOLUME orderVolumeType;
   COrder(E_MOTION _motion, E_VOLUME _volume):orderMotionType(_motion),orderVolumeType(_volume){}
};

void OnStart(){
   COrder* current = new COrder(COrder::HIGHER,COrder::FIXED);
 } 

这是在你不想把枚举放在全局范围内 的情况下。

 
Vladimir Simakov:

这是在你不想把枚举放在全局范围内 的情况下。

嗯...

我只是不知道该怎么做。

 COrder* current = new COrder(COrder::HIGHER,COrder::FIXED);

谢谢!

 

有没有人有一个优雅的解决方案,用JSON来上传不复杂的对象?

我需要一个这样的MQL代码的例子。

public class COrder
    {
        public enum E_MOTION { HIGHER, LOWER, ZIGZAG }
        public enum E_VOLUME { FIXED, INC, DEC }

        public bool IsRunning { get; set; }
        public int OpenPrice { get; set; }
        public int ClosePrice { get; set; }
        public E_VOLUME OrderVolumeType { get; set; }
        public E_MOTION OrderMotionType { get; set; }
        
    }

    class Program
    {
        static void Main(string[] args)
        {
            var current = new COrder {
                IsRunning = false, 
                OpenPrice = 1200,
                ClosePrice = 1300,
                OrderMotionType = COrder.E_MOTION.ZIGZAG, 
                OrderVolumeType = COrder.E_VOLUME.FIXED };

            string json = JsonSerializer.Serialize<COrder>(current);
            Console.WriteLine(json);
            Console.ReadLine();
        }
    }

{"IsRunning":false,"OpenPrice":1200,"ClosePrice":1300,"OrderVolumeType":0,"OrderMotionType":2}

MQL序列化器可在https://www.mql5.com/ru/code/13663

但我不明白正确的字段遍历的结构

 
Igor Makanu:

但我不知道如何正确地遍历对象的字段

宏观调控是一切。)
 
Alexey Navoykov:
宏量是一切!)

嗯哼...我再试着问一下。

请帮助我帮助一个考试者!请

 
Igor Makanu:

嗯哼...我再试着问一下。

请帮助我,并需要一个例子!请!

好吧,如果问题具体涉及绕过田地,那就是这样的。

#define SERIALIZE5(object, m1, m2, m3, m4, m5)  /* your code */

...

SERIALIZE5(current, IsRunning, OpenPrice, ClosePrice, OrderVolumeType, OrderMotionType);

你可以自己解决宏的主体问题)。

 
Alexey Navoykov:

好吧,如果问题是关于字段遍历的,多多少少是这样的。

而且你可以自己解决宏观的主体问题)。

好吧,这是个好主意!

谢谢你!

 
另一方面,对于序列化来说,明确指定字段的文本名称可能更好,这样你可以在以后的代码中重新命名它们,而不用担心保存的文件会停止工作。