关于OOP(面向对象的编程)的问题 - 页 9 1234567891011 新评论 Viktar Dzemikhau 2014.04.27 09:05 #81 Integer: 这意味着你必须使用new操作符创建一个实例。 有一件事我不明白。使用新 运营商的令人信服的理由是什么?没有它,你就无法做到,对吗? Dmitry Fedoseev 2014.04.27 09:08 #82 hoz: 有一件事我不明白。有什么好的理由来强制使用新的 运营商?没有它也行吗? 如果你想动态地创建对象,就需要它。如果你事先不知道将需要多少个对象和哪些类型的对象。 Vadim Zhunko 2014.04.27 09:33 #83 hoz: Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак? Integer: 如果你需要动态地创建对象,就需要它。如果你事先不知道需要多少个对象和哪些类型的对象, 。 你可以使用动态 类数组。在MQL中,这将发挥作用。在C++中,类成员的初始化可能存在问题。这就是为什么最好在数组中放一个智能指针。所以你不必处理类的初始化和内存清除。 Viktar Dzemikhau 2014.05.04 17:30 #84 mql5:class cFather { public: int GetData() {return 3;} }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class cChild : public cFather { public: int GetData() {return 5;} }; int f(cFather *p) {return p.GetData();} //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnStart() { cChild obj,*ptr=GetPointer(obj); f(ptr); // вернет 3 ((cFather *)ptr).GetData(); // вернет 3 return 0; } 这种结构是如何 "读 "出来的? ((cFather *)ptr).GetData(); 啊,特别是。 (cFather *)ptr) 我在看,我不明白发生了什么事...... keekkenen 2014.05.04 17:53 #85 hoz: 这种结构是如何 "读 "出来的? ((cFather *)ptr).GetData(); ptr被转换为cFather 类型(类),其(cFather)方法 GetData()被调用 像这样的事情... Viktar Dzemikhau 2014.05.04 19:03 #86 keekkenen:ptr被转换为cFather 类型(类),其(cFather)方法 GetData()被调用像这样的事情... 这是一个奇怪的事情...我大约是这么想的,但是......被投到一个类型(类)上就太多了。无论如何,在编程中,就我所知,不建议向一个类型(类)投递。但这不只是标准的类型转换--而是类的转换。 好吧,让我们再一次回到这个代码。 class cFather { public: int GetData() {return 3;} }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class cChild : public cFather { public: int GetData() {return 5;} }; int f(cFather *p) {return p.GetData();} //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnStart() { cChild obj,*ptr=GetPointer(obj); f(ptr); // вернет 3 ((cFather *)ptr).GetData(); // вернет 3 return 0; } 在这里,在f 函数原型 的参数中,我们可以清楚地看到,f 函数在参数中采取了cFather 类的一个方法。此外,我们在START代码中看到以下情况。 f(ptr); // вернет 3 这时,f 函数需要一个指向cChild 类的指针,而不是cFather 类的一个方法。由于cChild obj,*ptr = GetPointer( obj )。 这背后的逻辑是什么? keekkenen 2014.05.04 19:32 #87 逻辑在哪里? 在f()方法中,我认为逻辑是,对于cFather(或其后代),传入的参数将被正确处理。 Viktar Dzemikhau 2014.05.04 20:29 #88 keekkenen: 逻辑在哪里? 在f()方法中,我认为逻辑是传入的参数将被正确处理为cFather(或其继承者)。 I.e. int f(cFather *p) {return p.GetData();} 这里*p 是一个指向cFather的 指针? 同时,我正在学习C++,对类似的词汇感到有些困惑。不过这里的指针不一样。 Vadim Zhunko 2014.05.04 21:52 #89 hoz: I.e. 这里*p 是一个指向cFather的 指针? 同时,我正在学习C++,我对类似的词汇感到有些困惑。不过这里的指针并不一样。 cFather是 一个指针类型。指针变量本身指向类的一个实例。 Viktar Dzemikhau 2014.05.16 11:15 #90 我已经有几个星期没有遇到问题了。我决定问它。这并不太复杂,但从逻辑上讲,我想知道这是否是一个选择。以下是代码。 struct Name { string first_name; // имя string last_name; // фамилия }; class CPerson { protected: Name m_name; // имя public: void SetName(string n); string GetName(){return(m_name.first_name+" "+m_name.last_name);} private: string GetFirstName(string full_name); string GetLastName(string full_name); }; void CPerson::SetName(string n) { m_name.first_name=GetFirstName(n); m_name.last_name=GetLastName(n); } string CPerson::GetFirstName(string full_name) { int pos=StringFind(full_name," "); if(pos>0) StringSetCharacter(full_name,pos,0); return(full_name); } string CPerson::GetLastName(string full_name) { string ret_string; int pos=StringFind(full_name," "); if(pos>0) ret_string=StringSubstr(full_name,pos+1); else ret_string=full_name; return(ret_string); } 这段代码中只有2个公共函数。 public: void SetName(string n); string GetName(){return(m_name.first_name+" "+m_name.last_name);} 而这2个私有函数在需要时直接通过公有函数调用,或者说公有函数。有趣的是,void SetName(string n) 函数有参数n,但两个私有方法私有:string GetFirstName(string full_name) 和string GetLastName(string full_name) 由于某种原因没有相同的参数。尽管如果你使用这段代码(而不是另一段),私有方法是通过公有方法调用的,参数相同,没有其他方法。那么我为什么要给参数起不同的名字呢? 我希望这个问题是清楚的。 1234567891011 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这意味着你必须使用new操作符创建一个实例。
有一件事我不明白。有什么好的理由来强制使用新的 运营商?没有它也行吗?
如果你想动态地创建对象,就需要它。如果你事先不知道将需要多少个对象和哪些类型的对象。
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
如果你需要动态地创建对象,就需要它。如果你事先不知道需要多少个对象和哪些类型的对象,
。
你可以使用动态 类数组。在MQL中,这将发挥作用。在C++中,类成员的初始化可能存在问题。这就是为什么最好在数组中放一个智能指针。所以你不必处理类的初始化和内存清除。
这种结构是如何 "读 "出来的?
啊,特别是。
我在看,我不明白发生了什么事......这种结构是如何 "读 "出来的?
ptr被转换为cFather 类型(类),其(cFather)方法 GetData()被调用
像这样的事情...
ptr被转换为cFather 类型(类),其(cFather)方法 GetData()被调用
像这样的事情...
这是一个奇怪的事情...我大约是这么想的,但是......被投到一个类型(类)上就太多了。无论如何,在编程中,就我所知,不建议向一个类型(类)投递。但这不只是标准的类型转换--而是类的转换。
好吧,让我们再一次回到这个代码。
在这里,在f 函数原型 的参数中,我们可以清楚地看到,f 函数在参数中采取了cFather 类的一个方法。此外,我们在START代码中看到以下情况。
f(ptr); // вернет 3
这时,f 函数需要一个指向cChild 类的指针,而不是cFather 类的一个方法。由于cChild obj,*ptr = GetPointer( obj )。
这背后的逻辑是什么?
逻辑在哪里?
在f()方法中,我认为逻辑是,对于cFather(或其后代),传入的参数将被正确处理。
逻辑在哪里?
在f()方法中,我认为逻辑是传入的参数将被正确处理为cFather(或其继承者)。
I.e.
这里*p 是一个指向cFather的 指针?
同时,我正在学习C++,对类似的词汇感到有些困惑。不过这里的指针不一样。
I.e.
这里*p 是一个指向cFather的 指针?
同时,我正在学习C++,我对类似的词汇感到有些困惑。不过这里的指针并不一样。
我已经有几个星期没有遇到问题了。我决定问它。这并不太复杂,但从逻辑上讲,我想知道这是否是一个选择。以下是代码。
这段代码中只有2个公共函数。
而这2个私有函数在需要时直接通过公有函数调用,或者说公有函数。有趣的是,void SetName(string n) 函数有参数n,但两个私有方法私有:string GetFirstName(string full_name) 和string GetLastName(string full_name) 由于某种原因没有相同的参数。尽管如果你使用这段代码(而不是另一段),私有方法是通过公有方法调用的,参数相同,没有其他方法。那么我为什么要给参数起不同的名字呢?
我希望这个问题是清楚的。