OLP. Questões de aplicação - página 11

 
Interesting:

Como é bom ser capaz de ler... :)

Também não é má abordagem, embora, como entendi, ambas as abordagens sejam calculadas sobre a transferência/leitura de apenas um parâmetro (embora de tipos diferentes).

Mas como resolver o problema, quando se tem muitos parâmetros e não se pode colocar todos eles numa classe base?

Tanto quanto sei, tem de introduzir um índice do parâmetro que está a passar (também pode criar um array numa classe com parâmetros armazenados por índice)?

Também não o compreendo...

No meu exemplo há um índice, só que não é numérico numa forma explícita, mas um enum....

 

Esquece, não vale a pena.

 

Interesting:

Yedelkin:

Em geral, na sequência de uma discussão sobre o problemahttps://www.mql5.com/ru/forum/3566/page6#comment_58280 enviou um pedido ao RS.

1. Não sei, não sei.

Penso que os criadores não tomarão certas medidas, sacrificando a funcionalidade em nome da segurança (e com razão, por um lado).

Relatórios.

A candidatura foi assim:
...

Sugestão:

1. Clarificar a secção "Polimorfismo" no manual "Polimorfismo" em termos de especificação de como preencher correctamente as formas de matriz[10] com instâncias de classes derivadas de CShape (dar um exemplo).

2. verificar se a corda está escrita correctamente:

CShape[10] shapes;                       // массив объектов CShape

3. Explicar se deve ou não colocar parênteses imediatamente após o nome da classe que está a ser declarada ao declarar classes:

classe CShape{};

classe CCircle{} : CShapepúblico

classe CSquare{} : CSquarepúblico

Resposta:

Rashid Umarov 2011.04.11 15:17

No momento de escrever a ajuda, alguns pontos ainda não estavam claros para documentação. Iremos corrigir este ponto e acrescentar o código correcto. Obrigado pela sua mensagem.

Uma descrição alargada será acrescentada à Ajuda, aqui está um extracto da mesma:

Assumimos que o nosso programa utiliza objectos de diferentes tipos (CCircle e CSquare) mas herdados de um tipo de base CShape. O polimorfismo permite-nos criar um conjunto de objectos de tipo base CShape, mas quando declaramos este conjunto, os próprios objectos ainda são desconhecidos e o seu tipo é indefinido.

A decisão do tipo de objecto que será contido em cada elemento da matriz será feita durante a execução do programa. Isto implica a criação dinâmica de objectos para as classes correspondentes e, portanto, a necessidade de utilizar apontadores de objectos em vez dos próprios objectos.

Para criar objectos dinamicamente, é utilizado o novo operador; cada um desses objectos deve ser eliminado de forma independente e explícita pelo operador de eliminação. Por conseguinte, iremos declarar um conjunto de indicadores do tipo CShape e criar um objecto do tipo requerido para cada um dos seus elementos(new_class_name), como se mostra no guião de amostra:

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart()

  {

//--- объявим массив указателей объектов базового типа 

   CShape *shapes[5];   // массив указателей на объекты CShape



//--- здесь заполняем массив производными объектами

//--- объявим указатель на объект типа CCircle

   CCircle *circle=new CCircle();

//--- задаем свойства объекта по указателю circle

   circle.SetRadius(2.5);

//--- поместим в shapes[0] значение указателя

   shapes[0]=circle;



//--- создаем еще один объект CCircle и запишем его указатель в shapes[1]

   circle=new CCircle();

   shapes[1]=circle;

   circle.SetRadius(5);



//--- тут мы намеренно "забыли" задать значение для shapes[2]

//circle=new CCircle();

//circle.SetRadius(10);

//shapes[2]=circle;



//--- для неиспользуемого элемента установим значение NULL

   shapes[2]=NULL;



//--- создаем объект CSquare и запишем его указатель в shapes[3]

   CSquare *square=new CSquare();

   square.SetSide(5);

   shapes[3]=square;



//--- создаем объект CSquare и запишем его указатель в shapes[4]

   square=new CSquare();

   square.SetSide(10);

   shapes[4]=square;



//--- массив указателей есть, получим его размер

   int total=ArraySize(shapes);

//--- пройдем в цикле по всем указателям в массиве 

   for(int i=0; i<5;i++)

     {

      //--- если по указанному индексу указатель является валидным

      if(CheckPointer(shapes[i])!=POINTER_INVALID)

        {

         //--- выведем в лог тип и площадь фигуры

         PrintFormat("Объект типа %d имеет площадь %G",

               shapes[i].GetType(),

               shapes[i].GetArea());

        }

      //--- если указатель имеет тип POINTER_INVALID

      else

        {

         //--- сообщим об ошибке

         PrintFormat("Объект shapes[%d] не инициализирован! Его указатель %s",

                     i,EnumToString(CheckPointer(shapes[i])));

        }

     }



//--- мы должны самостоятельно уничтожить все созданные динамические объекты

   for(int i=0;i<total;i++)

     {

      //--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMIC

      if(CheckPointer(shapes[i])==POINTER_DYNAMIC)

        {

         //--- сообщим об удалении

         PrintFormat("Удаляем shapes[%d]",i);

         //--- уничтожим объект по его указателю

         delete shapes[i];

        }

     }

  }


Note que ao apagar um objecto com o operador de apagar, deve verificar o tipo do seu ponteiro. Só pode apagar objectos com ponteiro POINTER_DYNAMIC, obterá um erro para apontadores de outro tipo.

Penso que este exemplo cobre completamente a ideia de criar uma série de apontadores.
Rashid Umarov 2011.04.11 10:31

Obrigado pelo correio, corrigimos №2 e №3. Estará em novas versões de ajuda



 

Pergunta. A biblioteca padrão utiliza as seguintes linhas

void CTrade::Request(MqlTradeRequest& request) const
  {...}

O Manual de Referência diz: "const specifier const não é aplicável a membros de estruturas e classes". O que significa utilizar const num método de classe acima, e quais são as regras para a sua utilização em tais casos?

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

Yedelkin:

...............

O que significa a utilização de const num método de classe, e quais são as regras para a sua utilização em tais casos?

Oh sim, há muito tempo que também me interrogo sobre isso. Quero utilizar a língua de uma forma significativa, plenamente consciente das "regras do jogo".
 
Yedelkin:

Pergunta. A biblioteca padrão utiliza as seguintes linhas

O Manual de Referência diz: "const specifier const não é aplicável a membros de estruturas e classes". O que significa utilizar const num método de classe acima, e quais são as regras para a sua utilização em tais casos?

Um membro da estrutura/classe é uma coisa, mas um método é outra.

Um método descrito como const const significa que não altera o estado/membros da sua classe. Ou seja, depois de chamar tal método, o estado interno da classe permanece inalterado. É usado para, adicionalmente, dizer ao compilador para verificar se há tentativas de mudar os membros da classe.

 
Renat:

Um membro da estrutura/classe é uma coisa e um método é outra.

Um método descrito como const const significa que não altera o estado/membros da sua classe. Ou seja, o estado interno da classe permanece inalterado depois de este método ser chamado. É usado para, adicionalmente, dizer ao compilador para verificar se há tentativas de mudar os membros da classe.

Uau. Obrigado! E eu arrebentei os meus miolos.

 
TheXpert:
A propósito, uma pergunta lógica já que estamos a falar do assunto -- não há manual e não é esperado?

Como poderia ser utilizado? Porque os fios não interagem um com o outro,

Se os dados pudessem ser livremente transferidos entre fios, então, sim, haveria necessidade de tal instrução.

 
Raios, pensava que estava a escrever algo de errado :) agora sei o que é. Não volátil, claro -- mutável:))
 
class COracleTemplate
  {
private:
public:
   string            filename;
                     COracleTemplate(){Init();};
                    ~COracleTemplate(){DeInit();};
   virtual void      Init(){filename=this.Name();Print("loadSettings from ",filename);};
   virtual void      DeInit(){Print("saveSettings to ",filename);};
   virtual string    Name(){return("Prpototype");};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CCO2:public COracleTemplate
  {
   virtual string    Name(){return("CO2");};
  };
class CH2O:public COracleTemplate
  {
   virtual string    Name(){return("H2O");};
  };
COracleTemplate* CO2,*H2O;
void OnStart()
  {
   CO2=new CCO2;
   Print(CO2.Name()," filename=",CO2.filename);
   delete CO2;
   
   H2O=new CH2O;
   Print(H2O.Name()," filename=",H2O.filename);
   delete H2O;
   
  }

Boa tarde.

Tal questão.

Sobre o código acima

O que fiz de errado ou é geralmente inalcançável no MT5?

Quero (como penso ser óbvio) - obter nomes sobrepostos em variáveis de nome de ficheiro...

Razão: