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

 
equivalent23:

Claro que sim:

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.

Depois podemos aplicar um novo operador.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL:

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...

 
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.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL:

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..."

 
AlexSTAL:

Uma matriz deve ser do tipo apontador para as classes, não do tipo de classe em si.

Depois pode aplicar o novo operador.

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.

 
Interesting:
Não vai funcionar correctamente. Formará, no entanto, uma matriz.
O que quer dizer com não funciona?
 
Interesting:

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;

void OnStart()
  {
   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:
   virtual void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   virtual void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   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.