MQL5의 OOP에 대한 질문 - 페이지 67

 

그런 또 다른 질문은 Wiki 기사 Abstract class입니다 .

C++ 예제에 관심

 class CA { // Абстрактный класс
   public :
    CA ( void ) { std::cout << "This object of the class " ; }

     virtual void Abstr ( void ) = 0 ; // Чистая (пустая) виртуальная функция.
     void          fun   ( void ) { std::cout << "Реализация не будет наследоваться!" ; }

    ~CA () { std::cout << "." << std::endl; } //Вызывается в обр. порядке конструкторов
  };

class CB : public CA {
   public :
    CB ( void ) { std::cout << "CB;" ; }

     void Abstr ( void ){ std::cout << " call function cb.Abstr();" ; } //Подменяющая функция.
     void fun   ( void ){ std::cout << " call function cb.fun()" ; }

    ~CB () {} // Неверно для абстр. кл. ~CB(){ ~CA(); } 
  };

class CC : public CA {
   public :
    CC ( void ) { std::cout << "CC;" ; }

     void Abstr ( void ) { std::cout << " call function cc.Abstr();" ; } //Подменяющая функция.
     void fun   ( void ) { std::cout << " call function cc.fun()" ; }

  ~CC () {} // Неверно для абстр. кл. ~CC(){ ~CA(); } 
  };

int main () {
  std::cout << "Program:" << std::endl;
  CB cb;
  cb.Abstr(); cb.fun(); cb.~CB();

  CC cc;
  cc.Abstr(); cc.fun(); cc.~CC();

   return 0 ;
  }

프로그램 결과:

프로그램:

CB 클래스의 이 객체. 호출 함수 cb.abstr(); 함수 cb.fun()을 호출합니다.

CC 클래스의 이 객체. 호출 함수 cc.abstr(); cc.fun() 함수를 호출합니다.

.

.


void fun( void ) 메서드에 관심이 있습니다.

- 가상 지정자가 없는 이유는 무엇입니까?

- virtual 을 추가하면 미래에 어떤 변화가 생길까요?


왜 그리고 무엇을 위한 것인지에 대한 코드는 다음과 같습니다.

 class base
{
public :
   virtual void HighPriorityTask() {}
   virtual void Task() {}
};
//+------------------------------------------------------------------+
class A: public base
{
public :
   virtual void HighPriorityTask() { Print ( __FUNCSIG__ ); }
};
//+------------------------------------------------------------------+
class B: public base
{
public :
   virtual void Task() { Print ( __FUNCSIG__ ); }
};

//+------------------------------------------------------------------+
void OnStart ()
{
   base *obj[ 4 ];;
   obj[ 0 ] = new A; obj[ 1 ] = new A;  
   obj[ 2 ] = new B; obj[ 3 ] = new B; 
   for ( int i= ArraySize (obj)- 1 ; i>= 0 ; i--)
   {
      obj[i].HighPriorityTask();
      obj[i].Task();
   }
   
   for ( int i= ArraySize (obj)- 1 ; i>= 0 ; i--)
       delete obj[i];

2020.05.28 14:41:20.294 tst (EURUSD,H1) 무효 B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) 무효 B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) 무효 A::HighPriorityTask()

2020.05.28 14:41:20.298 tst (EURUSD,H1) 무효 A::HighPriorityTask()

그것은 내가 원하는 대로 작동합니다 - 기본 클래스가 있고 그 클래스에서 상속하지만 상속인에게는 하나의 메서드만 필요하며 선언 및 초기화 순서에 관계없이 먼저 HighPriorityTask( ) 메서드와 Task()


물론 모두 한 사이클에서

간단한 방법으로 가능합니까?

 
Igor Makanu :

물론 모두 한 사이클에서

간단한 방법으로 가능합니까?

그리고 왜 이것을 한 주기로 수행해야 합니까?

그리고 왜 자연스럽습니까?

당연히 적어도 두 개의 사이클이 있을 것입니다.

 
Koldun Zloy :

그리고 왜 이것을 한 주기로 수행해야 합니까?

그리고 왜 자연스럽습니까?

당연히 적어도 두 개의 사이클이 있을 것입니다.

좋아, 2주기, 그래서 2주기, 그래서 기적은 없을 것이다((

 
Igor Makanu :

좋아, 2주기, 그래서 2주기, 그래서 기적은 없을 것이다((

주기를 완전히 없애려고 할 수 있습니다.
루프와 재귀 없이 1에서 100까지 인쇄하는 방법의 예가 있습니다.
물론 이것이 일반적으로 질문의 주제인 경우 이러한 예가 도움이 될 것입니다.))

Печать от 1 до 100 на C ++, без цикла и рекурсии | Портал информатики для гиков
  • 2020.01.01
  • espressocode.top
Ниже приводится программа на C ++, которая печатает от 1 до 100 без цикла и без рекурсии. #include using namespace std;    template
 
Roman :
이게 왜 여기 뜬금없지?
 
Igor Makanu :

그런 또 다른 질문은 Wiki 기사 Abstract class입니다 .

C++ 예제에 관심

프로그램 결과:

프로그램:

CB 클래스의 이 개체. 호출 함수 cb.abstr(); 함수 cb.fun()을 호출합니다.

CC 클래스의 이 객체. 호출 함수 cc.abstr(); cc.fun() 함수를 호출합니다.

.

.


void fun( void ) 메서드에 관심이 있습니다.

- 가상 지정자가 없는 이유는 무엇입니까?

- virtual 을 추가하면 미래에 어떤 변화가 생길까요?


왜 그리고 무엇을 위한 것인지에 대한 코드는 다음과 같습니다.

2020.05.28 14:41:20.294 tst (EURUSD,H1) 무효 B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) 무효 B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) 무효 A::HighPriorityTask()

2020.05.28 14:41:20.298 tst (EURUSD,H1) 무효 A::HighPriorityTask()

그것은 내가 원하는 대로 작동합니다 - 기본 클래스가 있고 그 클래스에서 상속하지만 상속인에게는 하나의 메서드만 필요하며 선언 및 초기화 순서에 관계없이 먼저 HighPriorityTask( ) 메서드와 Task()


물론 모두 한 사이클에서

간단한 방법으로 가능합니까?

1. 기본 클래스 포인터를 선언하고 자식 개체를 생성하는 경우 동일한 기본 클래스 포인터를 통해 메서드를 호출할 때:

a) 가상 메소드는 자식 클래스에 의해 호출됩니다(이를 위해 특별히 생성된 가상 함수 테이블을 통해)

b) 비가 상 메소드는 기본 클래스에 의해 호출됩니다. 자식 클래스에서 재정의하더라도.

2. 한 사이클에서 바로 하고 싶다면

a) 유형별로 객체 배열을 정렬하는 번거로움.

b) 특정 작업의 경우 - 이러한 작업을 수행하는 개체에 대한 별도의 포인터 배열을 유지합니다. 저것들. HighPriorityTask 를 호출해야 하는 모든 개체

first라는 별도의 배열에 저장해야 합니다.

추신 그러나 정렬 없이 이론적으로 어떻게 상상할 수 있습니까? 루프의 한 패스에서 먼저 객체의 절반이 실행되고 나머지는 실행될 것입니다. 스마일 글쎄, 울타리에 작업의 대기열만 있다면.

그러나 이것은 이미 창조적 인 질문입니다. 페니 문제를 해결하는 정교한 방법을 많이 생각해 낼 수 있습니다.)) 가장 중요한 것은 물리 법칙을 침해하지 않는 것이며 모든 것이 잘 될 것입니다)))

 
Aleksey Mavrin :

2. 한 사이클에서 바로 하고 싶다면

a) 유형별로 객체 배열을 정렬하는 번거로움.

b) 특정 작업의 경우 - 이러한 작업을 수행하는 개체에 대한 별도의 포인터 배열을 유지합니다. 저것들. HighPriorityTask 를 호출해야 하는 모든 개체

first라는 별도의 배열에 저장해야 합니다.

추신 그러나 정렬 없이 이론적으로 어떻게 상상할 수 있습니까? 루프의 한 단계에서 먼저 개체의 절반이 실행되고 나머지는 실행될 것입니다. 스마일 글쎄, 울타리에 작업의 대기열만 있다면.

그러나 이것은 이미 창조적 인 질문입니다. 페니 문제를 해결하는 정교한 방법을 많이 생각해 낼 수 있습니다.)) 가장 중요한 것은 물리 법칙을 침해하지 않는 것이며 모든 것이 잘 될 것입니다)))

나는 확실히 원하지 않습니다. 컴파일러가 빈 메서드를 최적화한다고 생각합니다.

알렉세이 마브린 :

1. 기본 클래스 포인터를 선언하고 자식 개체를 생성하는 경우 동일한 기본 클래스 포인터를 통해 메서드를 호출할 때:

a) 가상 메소드는 자식 클래스에 의해 호출됩니다(이를 위해 특별히 생성된 가상 함수 테이블을 통해)

b) 비가 상 메소드는 기본 클래스에 의해 호출됩니다. 자식 클래스에서 재정의하더라도.

예, 어떤 이유로 저는 방금 json 라이브러리 https://www.mql5.com/en/code/11134 를 지배했다는 것을 기억하지 못했습니다.

컴파일러 경고가 있었습니다

더 이상 사용되지 않는 동작, 숨겨진 메소드 호출은 향후 MQL 컴파일러 버전에서 비활성화됩니다.

클래스에서 메소드를 지정하여 처리

 this .JSONValue:: getLong(getValue(index),out);

감사합니다, 전반적으로 선명한 그림

 
Igor Makanu :

나는 확실히 원하지 않습니다. 컴파일러가 빈 메서드를 최적화한다고 생각합니다.

가상? 사실이 아닙니다. 그러나 빈 함수를 호출하는 것은 어쨌든 많이 먹지 않을 것입니다.

이고르 마카누 :

좋아, 2주기, 2주기, 그러면 기적은 없을 것입니다((

논리적으로 두 번에 수행되는 작업을 한 사이클에 밀어 넣는 이유는 무엇입니까? 결국 속도, 명확성 또는 단순성 측면에서 이득이 없으며 하드 드라이브의 크기는 오랫동안 메가 바이트 단위가 아니라 측정됩니다.

 
Andrei Trukhanovich :

논리적으로 두 번에 수행되는 작업을 한 사이클에 밀어 넣는 이유는 무엇입니까? 결국 속도, 명확성 또는 단순성 측면에서 이득이 없으며 하드 드라이브의 크기는 오랫동안 메가 바이트 단위가 아니라 측정됩니다.

그리고 난 아직 아무것도 꽝! ))))

일반적인 메서드 호출과 유사한 작업을 수행하는 특성을 알 때까지

감사합니다, 잘 설명

안드레이 트루하노비치 :

가상? 사실이 아닙니다.

예를 들어 질문은 다형성 수단의 다양한 선택에서 나타났고, 그런 다음 그것 없이 가상하고, 상속하고, 파생 클래스에서 이 메서드를 닫습니다.

 
Roman :

주기를 완전히 없애려고 할 수 있습니다.
루프와 재귀 없이 1에서 100까지 인쇄하는 방법의 예가 있습니다.
물론 이것이 일반적으로 질문의 주제인 경우 이러한 예가 도움이 될 것입니다.))

그리고 뭐? 또 다른 패치. 그것은 패턴의 지지자들이 그를 인식하지 못한 것뿐입니다. 분명히 정통도 아니고 정식도 아닙니다. 재귀는 왜 안되지? 또한 재귀는 함께가 아니라 건너 뜁니다.

사유: