Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Claro que sim:
Percebi que o problema é como preenchercorrectamente as formas da matriz[10] com instâncias de classes derivadas do CShape. A minha variante sugerida não funciona por alguma razão. Pensemos.
A matriz deve ser do tipo ponteiro de classe, não do tipo de classe em si.
Depois podemos aplicar um novo operador.
A matriz deve ser do tipo de apontadores de classe, não da classe em si.
Depois pode aplicar o novo operador.
Posso dar-vos um exemplo?
É que o exemplo que dei foi retirado da documentação e não está claro como deve funcionar...
Percebi que o problema é como preenchercorrectamente as formas de matriz[10] com instâncias de classes derivadas do CShape. A minha variante sugerida não funciona por alguma razão. Pensemos.
Pense ou não, 100 rublos não é dinheiro.
O exemplo é 100 por cento de falhas, e tal implementação ou não é bem pensada ou não está terminada.
Não citarei os resultados das minhas próprias experiências em código, dar-vos-ei apenas as conclusões:
1. Se declarar objectos não como classes mas como estruturas, eles caberão facilmente numa matriz. Mas a virilidade terá de ser removida, e só se pode trabalhar com a funcionalidade do tipo de objectos que a matriz tem (neste caso, uma classe base);
2. 2. pode declará-los como indicadores, e depois pode formar uma matriz:
a) se as indicações não forem apagadas, ocorrem fugas de memória;
b) também não se pode trabalhar normalmente com funcionalidade descendente.
PS
Para ser mais exacto - a funcionalidade que foi declarada na classe base está disponível e também visível nos descendentes, mas tudo o que apareceu nos descendentes é inacessível.
Uma matriz deve ser do tipo apontador para as classes, não do tipo de classe em si.
Depois pode aplicar o novo operador.
Sim, também pensei nesta direcção, sobre a utilização de apontadores. Mas então as condições da documentação não são preenchidas:
"Para um quadrado (classe CSquare) a área é calculada através dos lados, para um círculo (classe CCircle) a área é expressa através do raio e assim por diante. Podemos criar uma matriz para armazenar objectos do tipo CShape, na qual podemos armazenar tanto o objecto de uma classe base como todos os seus descendentes. Mais tarde podemos chamar a mesma função para qualquer elemento desta matriz.
...Uma vez que precisamos dos valores correspondentes dos membros m_radius e m_square_side para calcular a área de um quadrado e de um círculo, adicionámos as funções SetRadius e SetSide() à declaração da classe correspondente. Agora podemos declarar um conjunto de tipos Forma e preenchê-lo com objectos de classes derivadas..."
Uma matriz deve ser do tipo apontador para as classes, não do tipo de classe em si.
Depois pode aplicar o novo operador.
Yedelkin:
...Uma vez que o cálculo da área de um quadrado e um círculo requer valores correspondentes de m_radius e m_square_side membros, adicionámos as funções SetRadius e SetSide() na declaração da classe correspondente. Agora podemos declarar um conjunto de tipos de Forma e preenchê-lo com objectos de classes derivadas...".
Tudo isto é que se o array for do tipo de classe base, a funcionalidade descendente não pode ser acedida. ou seja, SetRadius() e SetSide() tornam-se indisponíveis.
É por isso que posso ver três opções:
1. a matriz deve ser homogénea (se possível);
2. Não compreendo nada sobre a filosofia e arquitectura OOP da MQL5;
3. ou os criadores não implementaram o exemplo, ou não deram seguimento à pergunta.
Não vai funcionar correctamente. Formará, no entanto, uma matriz.
Para ser mais exacto - a funcionalidade que foi declarada na classe base está disponível, e ao mesmo tempo é visível nos descendentes, mas tudo o que apareceu nos descendentes é inacessível.
Sim, foi exactamente com isso que me deparei.
O exemplo é 100 por cento de falhas ...
Acontece que precisamos de uma resposta dos autores do Manual sobre este tópico.
Não vai funcionar correctamente. Formará, no entanto, uma matriz.
O truque é que se o array for do tipo de classe base, a funcionalidade descendente não pode ser acessada. i.e. SetRadius() e SetSide() tornam-se indisponíveis.
É por isso que posso ver três opções:
1. a matriz deve ser homogénea (se possível);
2. Não compreendo nada sobre a filosofia e arquitectura OOP da MQL5;
3. os criadores ou traíram um exemplo que não funciona, ou não completaram a tarefa.
Executar:
poderia ser feito de uma forma muito mais simples... por virtualização:
O que quer dizer com "não funciona normalmente"?
1. A funcionalidade descendente não está disponível. Não sei quem ou como, mas pessoalmente nunca tive acesso a SetRadius() e SetSide() do Array.Talvez haja uma forma de resolver o problema com o autogénero, mas quero passar sem ele.
2. Talvez esteja a trabalhar com apontadores errados, mas ou tenho uma fuga a toda a hora ou tenho de acertar nos apontadores mesmo no bloco onde o trabalho principal é feito.