Instanciar um objeto de uma classe aleatória

Iniciado por Darcamo, 03 de Agosto de 2006, 23:51

tópico anterior - próximo tópico

Darcamo

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

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.

Lamego

Para obter um número aleatório entre 0 e 8 basta utilizar:
random() % 9
no 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:
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

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