mql5中的OOP、模板和宏,细微之处和用途 - 页 26

 

出现了一个问题。

有一个 "程序 "类,它使用"新栏"和 "数据管理器 "类。而 "新酒吧 "类也使用 "数据管理器 "类。数据管理器 "类实现了公共的getters和setters。

class CDataManager
   {
private:
    string          m_symbol;
    ENUM_TIMEFRAMES m_timeframe;
public:
    //--- Геттеры и сеттеры
   };
class CNewBar
   {
private:
    CDataManager  m_data;
   };
class СProgram
   {
private:
    CNewBar        m_newBar;
    CDataManager   m_data;
   };

问题:在 "新条形 "类的程序初始化中,有哪些选项可以指定 "数据管理器 "类的 "符号 "和 "时间框架 "属性?我不希望在New Bar类中有公共的getters和setters来访问数据管理器字段。而且我们希望保持数据管理员的隐私。

换句话说:应用程序可以使用多个使用数据管理器的类。在程序的初始化过程中,所有类的所有经理字段都必须用必要的值进行初始化。但我不想在所有的类中创建获取器来访问数据管理器的字段。所以...

 
Alexey Kozitsyn:
根据你的描述,将这些设置分离成一个单独的实体是有意义的,对所有管理人员和其他人员都是一样的。
 
TheXpert:
根据你的描述,将这些设置分离成一个单独的实体是有意义的,对所有的管理者都是一样的,而不仅仅是

是的,看起来你需要从一个有经理字段getters的基类继承需要经理的类。谢谢你。

 
Alexey Kozitsyn:

出现了一个问题。

有一个 "程序 "类,它使用"新栏"和 "数据管理器 "类。而 "新酒吧 "类也使用 "数据管理器 "类。公共获取器和设置器在 "数据管理器 "类中实现。

问题:在 "新条形 "类的程序初始化中,有哪些选项可以指定 "数据管理器 "类的 "符号 "和 "时间框架 "属性?我不希望在New Bar类中有公共的getters和setters来访问数据管理器字段。而且我们希望保持数据管理员的隐私。

换句话说:应用程序可以使用多个使用数据管理器的类。在程序的初始化过程中,所有类的所有经理字段都必须用必要的值进行初始化。但我不想在所有的类中创建获取器来访问数据管理器的字段。所以...

class CDataManager
   {
private:
    string          m_symbol;
    ENUM_TIMEFRAMES m_timeframe;
public:
    CDataManager():m_symbol(_Symbol),m_timeframe(_Period){}
    CDataManager(string symbol,ENUM_TIMEFRAMES frame):m_symbol(symbol),m_timeframe(frame){}
    //--- Геттеры и сеттеры
   };
class CNewBar
   {
private:
    CDataManager*  m_data;
    bool           cIsDelData;
public:
   CNewBar(CDataManager* data=NULL):m_data(!data?new CDataManager:data),cIsDelData(!data){}
   CNewBar(string symbol,ENUM_TIMEFRAMES frame):m_data(new CDataManager(symbol,frame)),cIsDelData(true){}
  ~CNewBar() {if (cIsDelData) delete m_data;}
   };
class CProgram
   {
private:
    CNewBar        m_newBar;
    CDataManager   m_data;
public:
    CProgram():m_newBar(&m_data){}
   };

我就是这样做的。

 
Vladimir Simakov:

我大致上就是这么做的。

谢谢你的例子,到目前为止有点复杂,但总的来说,思路很清晰。随即产生了一个问题:好吧,如果 "一级嵌套" - 这里很清楚,但如果会有几级嵌套呢?

已添加。

也不清楚为什么cIsDelData字段?毕竟,你可以在析构器中对照POINTER_DINAMIC 检查m_data。还是我错了?

 

如果你做继承,你会得到很多不必要的方法。而且该对象必须是私有的。所以,你不会相信,但最简单的方法是对所有使用数据管理器的类进行设置。

如果所有的数据管理器都用相同的参数工作,最好不要创建对象,而是传递一个指针给一个数据管理器。在这种情况下,只需要一个setter来传递指针。

 
Alexey Kozitsyn:

谢谢你的例子,到目前为止有点复杂,但总的来说,思路很清晰。随即产生了一个问题:好吧,如果 "一级嵌套" - 这里很清楚,但如果会有几级嵌套?

已添加。

也不清楚为什么cIsDelData字段?毕竟,你可以在析构器中对照POINTER_DINAMIC检查m_data。还是我错了?

不,你错了。你可以传递一个指向动态对象的指针,然后,哎呀,安全地杀死它。
还有关于筑巢。你在最初需要的地方创建一个对象的实例,并且只有指针进一步,如上面的例子。如果在一般情况下,它打算在项目 中成为一个单子,你可以做一个单子,但我从来没有用mql做一个单子,所以我还不需要它,我得试试。
 
Dmitry Fedoseev:
弗拉基米尔-西马科夫

谢谢你,我会考虑的。

 
Vladimir Simakov:

我大致上是这样做的。

这个CDataManager* m_data 行是什么意思。

伙计们,我想做一件这样的事情。我有一个宏观。

#define  foor(a,b,v) \
for(;Funkziya(a,b,v);b++)
//я хочу доработать макрос чтобы получилось так
#define  foor1(a,b,v,g) \
//за основу будет взят первый макрос
for(;Funkziya(a,b,v)&&g;b++)//эффект должен быть такой где g это дополнительное выражение которое будет дописываться в новый макрос

因此,我将有两个宏foor和foor1

 
Seric29:

这个CDataManager* m_data 行是什么意思。

伙计们,我想做一件这样的事情。我有一个宏观。

因此,我将有两个宏foor和foor1

一个指向对象的指针。

无意冒犯,但对你来说,现在处理这样的宏伟目标还为时过早。首先,要理解我为什么这样做。

#define  foor1(a,b,v,g) \
for(;Funkziya(a,b,v)&&(g);(b)++)
原因: