Autor Tópico: Instanciar um objeto de uma classe aleatória  (Lida 3418 vezes)

Darcamo

  • Visitante
Instanciar um objeto de uma classe aleatória
« Online: 03 de Agosto de 2006, 23:51 »
O problema é o seguinte, tenho uma classe base da qual derivo 9 classes.
Quero utilizar um ponteiro da classe base para instanciar um objeto de uma das classes derivada (para poder utilizar polimorfismo).

Atualmente faço assim
Código: [Selecionar]
switch((int)(floor(9 * (double)random()/(double)RAND_MAX)))
{
case 0:
classeBasePtr = new ClasseDerivada0();
break;
case 1:
classeBasePtr = new ClasseDerivada1();
break;
case 2:
classeBasePtr = new ClasseDerivada2();
break;
case 3:
classeBasePtr = new ClasseDerivada3();
break;
case 4:
classeBasePtr = new ClasseDerivada4();
break;
case 5:
classeBasePtr = new ClasseDerivada5();
break;
case 6:
classeBasePtr = new ClasseDerivada6();
break;
case 7:
classeBasePtr = new ClasseDerivada7();
break;
case 8:
classeBasePtr = new ClasseDerivada8();
break;
}

A condição dentro do "switch" retorna um valor entre 0 e 8 e cada valor cai em um "case".
Eu queria saber se tem uma maneira melhor de fazer isso. Pensei em uma maneira, mas como a

Outro problema é que atualmente a probabilidade do objeto instanciado pertencer a qualquer uma das 9 classes é a mesma. Seria interessante se for possível utilizar probabilidades diferentes.

Offline Lamego

  • Usuário Ubuntu
  • *
  • Mensagens: 1.943
    • Ver perfil
Re: Instanciar um objeto de uma classe aleatória
« Resposta #1 Online: 05 de Agosto de 2006, 18:51 »
Para obter um número aleatório entre 0 e 8 basta utilizar:
Código: [Selecionar]
random() % 9no lugar desse comboio: (int)(floor(9 * (double)random()/(double)RAND_MAX))
Para garantir um bom nível de sorteio deve iniciar o gerador de números com:
Código: [Selecionar]
srandom(time(NULL));Programar com uma determinada probabilidade é simples mas não estou vendo utilidade nenhuma nisso :)
João Luís Marques Pinto
Mais programs e jogos para o Ubuntu

Darcamo

  • Visitante
Re: Instanciar um objeto de uma classe aleatória
« Resposta #2 Online: 05 de Agosto de 2006, 19:38 »
Já uso o
srandom(time(NULL));

Sem ele o sorteio é sempre o mesmo.

Quanto ao "comboio", eu usava em outro programa
(double)random()/(double)RAND_MAX
para retornar um número entre 0 e 1. Aí adaptei para o que vc viu. Nem lembrei do %. :)

Andei lendo algumas coisas ontem sobre casos em que o switch é uma boa opção e acho que nesse meu caso é melhor ficar com ele mesmo. Tô vendo se aprendo um pouco de SDL e esse pedaço de código faz parte de uma tentativa de fazer um tetris (já tá funcionando, mas ainda não tem pontuação e tá meio cru).