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....
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 Umarov2011.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 |//+------------------------------------------------------------------+voidOnStart()
{
//--- объявим массив указателей объектов базового типа
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_INVALIDelse
{
//--- сообщим об ошибкеPrintFormat("Объект shapes[%d] не инициализирован! Его указатель %s",
i,EnumToString(CheckPointer(shapes[i])));
}
}
//--- мы должны самостоятельно уничтожить все созданные динамические объектыfor(int i=0;i<total;i++)
{
//--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMICif(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 Umarov2011.04.11 10:31
Obrigado pelo correio, corrigimos №2 e №3. Estará em novas versões de ajuda
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?
O que significa a utilização de constnum 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".
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.
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.
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:
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:
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:
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:
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.
Obrigado pelo correio, corrigimos №2 e №3. Estará em novas versões de ajuda
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?
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?
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.
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.
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.
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...