MQL5中的OOP问题 - 页 19

 
Vladimir Simakov:
我有一个假设,就是不会有很多,比如说0.15。至少我没有听说过这个消息。如果我这样做,我将改变它。

我知道这不太可能,但你总是希望有完美的解决方案 ))))

好吧,这不是最大的问题,但我为自己制造了一个问题......我想要一个完美的OOP,但没有不必要的调用,一切都很理想。

我想有5个类的实例,但我需要对类的字段进行一次初始化--它们包含终端环境,在程序执行期间不会改变。

string         Language;

如果我声明静态字符串Language;- 那么将出现一个错误,即未解决的静态变量'A::Language'。

这里有一个例子

//+------------------------------------------------------------------+
class A
  {
public:
   string         Language;
                     A() { Print(__FUNCTION__); Language = TerminalInfoString(TERMINAL_LANGUAGE); }

  };
//+------------------------------------------------------------------+
class B:public A
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

我将在这个表单中初始化字符串Language 5次--这是不对的,它不会用静态修改器 编译。

而且,不需要有5份语言变量的副本!- 试着在B类中声明一个类的实例--同样的事情 5个语言变量有

2019.08.29 12:44:58.384 tst__ EURUSD,M15: 已初始化

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

 
Igor Makanu:

我知道这不太可能,但你总是希望有完美的解决方案 ))))

好吧,这不是最大的问题,但我为自己制造了一个问题......我想要一个完美的OOP,但没有不必要的调用,一切都很理想。

我想有5个类的实例,但我需要对类的字段进行一次初始化--它们包含终端环境,在程序执行期间不会改变。

如果我声明静态字符串Language;- 那么将出现一个错误,即未解决的静态变量'A::Language'。

这里有一个例子

我将在这个表格中初始化字符串Language 5次--这是不对的,而且它不能用静态修改器 编译

2019.08.29 12:44:58.384 tst__ EURUSD,M15: 已初始化

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

class Test
  {
private:
   static const string Language;
public:
                     Test(void){}
                    ~Test(void){}
  };
static const string Test::Language=::TerminalInfoString(TERMINAL_LANGUAGE);
 
Andrey Barinov:

好吧,这是个选项

但我想把它全部包在一个类中--在我的例子中,我有一个类B,我想要5个B的实例,但我不想初始化5次Language,因此我不想在每个实例中都有一个Language变量

我怎样才能摆脱多余的语言?

 
Igor Makanu:

好吧,这是个选项

但我想把它全部包在一个类中--在我的例子中,我有一个类B,我想要5个B的实例,但我不想初始化5次 Language,因此我不想在每个实例中都 有一个Language 变量

我怎样才能摆脱多余的语言?

继承。这样,它就只被初始化一次。

 
Igor Makanu:

我知道这不太可能,但你总是希望有完美的解决方案 ))))

好吧,这不是最大的问题,但我为自己制造了一个问题......我想要一个完美的OOP,但没有不必要的调用,一切都很理想。

我想有5个类的实例,但我需要对类的字段进行一次初始化--它们包含终端环境,在程序执行期间不会改变。

如果我声明静态字符串Language;- 那么将出现一个错误,即未解决的静态变量'A::Language'。

这里有一个例子

我将在这个表单中初始化字符串Language 5次--这是不对的,它不会用静态修改器 编译。

而且,不需要有5份语言变量的副本!- 试着在B类中声明一个类的实例--同样的事情 5个语言变量有

2019.08.29 12:44:58.384 tst__ EURUSD,M15: 已初始化

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

我现在正在用我的手机。今晚提醒我,我将告诉你如何解决这个问题。
 
Andrey Barinov:

继承。在这种形式下,它将只被初始化一次。

对我有用

//+------------------------------------------------------------------+
string MyTerminalInfoString()
  {
   Print(__FUNCTION__);
   return("ru");
  }
//+------------------------------------------------------------------+
class CLang
  {
protected:
   static const string Language;
public:
                     CLang(void) {Print(__FUNCTION__);}
                    ~CLang(void) {}
  };
//+------------------------------------------------------------------+
static const string CLang::Language=MyTerminalInfoString();
//+------------------------------------------------------------------+
class B:public CLang
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

2019.08.29 13:24:19.690 tst__ EURUSD,M15: 已初始化

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: MyTerminalInfoString


至少调用一次myTerminalInfoString()。


因此,我有点像一个单身汉了

谢谢你!

 
Vladimir Simakov:
我现在正在用我的手机。晚上提醒我,我会告诉你如何解决这个问题。

好的,如果不是太麻烦的话。

对我来说,Singleton主题是相当新的,有创意的空间--例子是

 
Igor Makanu:

好的,如果不是太麻烦的话。

对我来说,Singleton主题是相当新的,有创意的空间--例子是

那么,你是想要一个单子,还是一个对象的一般字段?
 
Vladimir Simakov:
那么,你需要一个对象的共同字段吗?

很难说我想要什么 ))))

让我试着把它变成文字。

- 我想要一个由构造函数初始化的类,这个类将没有任何方法;该类的目的是打开一个订单,然后根据脚本关闭和/或重新打开几个订单;脚本类型是一个枚举。

- 我将使用一个类的实例数组--至少5个

- 我不想每次打开订单都不调用终端环境。 因此,我想用SYMBOL_VOLUME_MAX、Symbol、SYMBOL_VOLUME_MIN和SYMBOL_VOLUME_STEP中的数字作为类中的常量值

- 我想优化变量的使用,也就是说,我不想重复上一段中的常数。


这大概就是我所看到的一切,但总的来说,现在的问题减少到了类本身的正确结构上,因为原来已经要继承了,所以SYMBOL_VOLUME_MAX , Symbol,SYMBOL_VOLUME_MIN ...以有一份,我想我还是会绊住错误输出,我将使用我的PrintLastError.mqhhttps://www.mql5.com/ru/code/24829#,像这样的东西。

 
一个静态变量,即使没有继承,也会对所有实例都是一样的。