Percebi que o problema é comopreenchercorrectamente a matriz de formas[10] com instâncias de classes derivadas do CShape. A opção que sugeri não funciona por alguma razão. Pensemos.
Yedelkin: 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.
Yedelkin: 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.
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..."
Não vai funcionar normalmente. Embora formará uma matriz.
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.
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.
Interessante:
O exemplo é 100 por cento de falhas ...
Acontece que precisamos de uma resposta dos autores do Manual sobre este tópico.
Interesting: 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:
class CBase
{
public:
void m_radius() {Print("CBase");}
};
class CTest : public CBase
{
public:
void m_radius() {Print("CTest");}
};
CBase* Base;
voidOnStart()
{
Base = new CTest;
Base.m_radius();
((CTest *)Base).m_radius();
delete Base;
}
poderia ser feito de uma forma muito mais simples... por virtualização:
class CBase
{
public:
virtualvoid m_radius() {Print("CBase");}
};
class CTest : public CBase
{
public:
virtualvoid m_radius() {Print("CTest");}
};
CBase* Base;
voidOnStart()
{
Base = new CTest;
Base.m_radius();
delete Base;
}
AlexSTAL: 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.
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.