OOP(객체 지향 프로그래밍)에 대한 질문 - 페이지 9

 
Integer :

즉, new 연산자로 인스턴스를 생성해야 합니다.
그래서 나는 한 가지를 이해하지 못합니다. new 연산자를 강제로 사용해야 하는 좋은 이유는 무엇입니까? 그가 없으면 방법이 없습니까?
 
hoz :
그래서 나는 한 가지를 이해하지 못합니다. new 연산자를 강제로 사용해야 하는 좋은 이유는 무엇입니까? 그가 없으면 방법이 없습니까?


객체의 동적 생성 이 필요한 경우 필요합니다. 필요한 개체의 수와 개체 유형을 미리 알 수 없는 경우.

 
hoz :
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
정수 :
객체의 동적 생성이 필요한 경우 필요합니다. 필요한 개체의 수와 개체 유형을 미리 알 수 없는 경우.

클래스의 동적 배열 을 사용할 수 있습니다. 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 ) 메서드 가 호출됩니다. 데이터 가져오기()

이 같은..

 
keekkenen :

ptr은 (클래스) cFather 유형으로 캐스팅되고 해당 ( cFather ) 메서드 가 호출됩니다. 데이터 가져오기()

이 같은..

어떤 종류의 주석 ... 나는 일종의 그렇게 생각했지만 .. 이것은 유형 (클래스)에 가져 오기에는 너무 많습니다. 프로그래밍에서, 그래서 내가 들은 한 특별한 언급을 하는 것은 권장되지 않습니다. 그리고 여기에서는 표준 유형으로 캐스팅하는 것이 아니라 클래스로 캐스팅합니다.

일반적으로 이 코드로 한 번 더 돌아가 보겠습니다.

 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

여기에서 함수 fcFather 클래스의 메소드가 아니라 분명히 cChild 클래스에 대한 포인터를 매개변수로 받습니다. 왜냐하면 cChild obj, *ptr = GetPointer( obj );

논리가 무엇입니까?

 

mm .. 논리는 어디에 있습니까?

f() 메서드에서 논리는 들어오는 매개 변수가 cFather(또는 그 후속 항목) 에 대해 올바르게 처리된다는 것입니다.

 
keekkenen :

mm .. 논리는 어디에 있습니까?

f() 메서드에서 논리는 들어오는 매개 변수가 cFather(또는 그 후속 항목) 에 대해 올바르게 처리된다는 것입니다.

저것들.

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

여기서 *pcFather 에 대한 포인터입니까?

동시에, 나는 C++를 배우고 있고 비슷한 어휘가 나를 약간 혼란스럽게 합니다. 포인터는 여기에서 동일하지 않지만 .

 
hoz :

저것들.

여기서 *pcFather 에 대한 포인터입니까?

동시에, 나는 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개의 private 함수는 필요할 때 public, 또는 public 함수를 통해 직접 호출됩니다. void SetName(string n) 함수에서 매개변수가 n 이고 두 private 메서드 모두에서 흥미롭습니다. string GetFirstName(string full_name)string GetLastName(string full_name) 어떤 이유로 매개변수가 동일하게 설정되지 않습니다. 이 코드(다른 코드가 아님)를 정확히 취하면 여기에서 이러한 비공개 메서드는 매개변수가 동일하고 다른 것은 없는 공개 메서드를 통해 호출됩니다. 그렇다면 매개변수에 다른 이름을 지정하는 이유는 무엇입니까?

질문이 명확하기를 바랍니다.