关于OOP(面向对象的编程)的问题 - 页 9

 
Integer:

这意味着你必须使用new操作符创建一个实例。
有一件事我不明白。使用 运营商的令人信服的理由是什么?没有它,你就无法做到,对吗?
 
hoz:
有一件事我不明白。有什么好的理由来强制使用新的 运营商?没有它也行吗?


如果你想动态地创建对象,就需要它。如果你事先不知道将需要多少个对象和哪些类型的对象。

 
hoz:
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
Integer:
如果你需要动态地创建对象,就需要它。如果你事先不知道需要多少个对象和哪些类型的对象,

你可以使用动态 类数组。在MQL中,这将发挥作用。在C++中,类成员的初始化可能存在问题。这就是为什么最好在数组中放一个智能指针。所以你不必处理类的初始化和内存清除。

 
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)
我在看,我不明白发生了什么事......
 
hoz:

这种结构是如何 "读 "出来的?

((cFather *)ptr).GetData();

ptr被转换为cFather 类型(类),其(cFather)方法 GetData()被调用

像这样的事情...

 
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 )。

这背后的逻辑是什么?

 

逻辑在哪里?

在f()方法中,我认为逻辑是,对于cFather(或其后代),传入的参数将被正确处理。

 
keekkenen:

逻辑在哪里?

在f()方法中,我认为逻辑是传入的参数将被正确处理为cFather(或其继承者)。

I.e.

 int f(cFather *p) {return p.GetData();}

这里*p 是一个指向cFather的 指针?

同时,我正在学习C++,对类似的词汇感到有些困惑。不过这里的指针不一样

 
hoz:

I.e.

这里*p 是一个指向cFather的 指针?

同时,我正在学习C++,我对类似的词汇感到有些困惑。不过这里的指针并不一样

cFather是 一个指针类型。指针变量本身指向类的一个实例。
 

我已经有几个星期没有遇到问题了。我决定问它。这并不太复杂,但从逻辑上讲,我想知道这是否是一个选择。以下是代码。

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) 由于某种原因没有相同的参数。尽管如果你使用这段代码(而不是另一段),私有方法是通过公有方法调用的,参数相同,没有其他方法。那么我为什么要给参数起不同的名字呢?

我希望这个问题是清楚的。