2010-12-08 17 views
5

Estoy tratando de diseñar una clase de armas para un juego. Esta es una parte del código que he llegado con para adaptarse a mis necesidades:¿Es posible tener una matriz de diferentes objetos que provienen de la misma clase base?

class weapon { 

public: 
    int fireRate; 
    int bulletDamage; 
    int range; 
    ofImage sprite; 
    ofImage bulletSprite; 
    bullet bullets[50]; 
    int activeBullet; 

public: 
    void fire(); 
}; 

class machineGun: public weapon { 
public: 
    void fire(); 
}; 

class flamer: public weapon { 
public: 
    void fire(); 
}; 

Y entonces me gustaría definir una matriz armas de este modo:

//Weapon variables 
const int totalWeapons = 2; 
int currentWeapon = 1; 
weapon weapons[totalWeapons]; 

me gustaría elemento [0] para representar la clase y elemento MachineGun [1] para representar la clase flamer. ¿Estoy abordando este problema de la manera correcta? ¿Debería refactorizar esto de alguna manera? ¿Cómo logro una matriz que contenga estas dos armas diferentes?

La idea es que cuando llamo al weapons[0].fire(); obtengo una clase de MachineGun y cuando llamo al weapons[1].fire(); recibo un incendio de flamer.




Editar: Gracias por ayudar a los chicos. Tengo algunos problemas con el uso de "armas [0] = new machineGun;". Aparece el error "no puedo asignar una matriz de tamaño constante 0" cuando intento ejecutar este código.

¿Alguien ha tenido alguna idea de por qué esto no funciona? Mi código actualizado es como la siguiente:

//Weapon variables 
const int totalWeapons = 2; 
int currentWeapon = 1; 
weapon weapons[totalWeapons]; 
weapons[0] = new machineGun; 
weapons[1] = new flamer; 

pero me da un montón de errores:

1>gameplay.cpp(49) : error C2466: cannot allocate an array of constant size 0 
1>gameplay.cpp(49) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>gameplay.cpp(49) : error C2371: 'weapons' : redefinition; different basic types 
1>  gameplay.cpp(48) : see declaration of 'weapons' 
1>gameplay.cpp(49) : error C2440: 'initializing' : cannot convert from 'machineGun *' to 'int []' 
1>  There are no conversions to array types, although there are conversions to references or pointers to arrays 
1>gameplay.cpp(50) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>gameplay.cpp(50) : error C2369: 'weapons' : redefinition; different subscripts 
1>  gameplay.cpp(48) : see declaration of 'weapons' 
1>gameplay.cpp(50) : error C2440: 'initializing' : cannot convert from 'flamer *' to 'int [1]' 
1>  There are no conversions to array types, although there are conversions to references or pointers to arrays 




que he tomado otro enfoque diferente y conseguido algunos errores diferentes . Todavía estoy bastante inseguro de cómo todo esto debe unirse.

//Weapon variables 
const int totalWeapons = 2; 
int currentWeapon = 1; 
weapon weapons[totalWeapons] = {new machineGun, new flamer}; 

Con errores:

1>gameplay.cpp(48) : error C2275: 'machineGun' : illegal use of this type as an expression 
1>  gameplay.h(36) : see declaration of 'machineGun' 
1>gameplay.cpp(48) : error C2275: 'flamer' : illegal use of this type as an expression 
1>  gameplay.h(41) : see declaration of 'flamer' 




La respuesta terminó siendo algo como esto:

//Weapon variables 
const int totalWeapons = 2; 
int currentWeapon = 1; 
weapon *weapons[totalWeapons] = {new machineGun, new flamer}; 

¡Gracias a todos los que me ayudaron a entender esto!

+0

Esto está bien si solo planeas tener un número constante de tipos de armas; entonces tendrías algo como 'weapons [0] = new machineGun; armas [1] = flamer nuevo; ' –

+0

Has declarado una serie de armas, y tanto tu máquina como tu lanzallamas son armas. ¿Esto no funciona? – Narveson

+0

@isbadawi, ¿puedes echar un vistazo a mi edición? Parece que no puedo hacerlo funcionar. – Sam152

Respuesta

2

Según lo observado por Ross, su matriz tiene que ser de tipo arma * para permitirle abatir tipos de armas especializadas.

Así,

weapon* weapons[totalWeapons]; 
weapons[0] = new machineGun; 

También como se ha señalado, como se va a crear dinámicamente éstos, tendrá que asegurarse de que limpie ellos más tarde o se va a ejecutar en pérdidas de memoria

+0

Gracias. Esto es lo más cercano a lo que lo hace funcionar. – Sam152

2

fire() necesita ser virtual - de esa manera, si lo llamas, se llamará a la implementación correcta.

declararemos como

virtual void fire();

A continuación, sólo asigna los objetos del tipo apropiado, por ejemplo weapon[0] = new flamer(); - asegúrese de eliminarla cuando haya terminado, o antes de la reasignación de otro objeto en la misma ranura .

Aparte de eso, su enfoque es exactamente cómo se debe implementar el polimorfismo. (Por supuesto, podría considerar un almacenamiento diferente al de una matriz tipo C, o asegurarse de implementar la verificación de límites adecuada, pero eso está más allá del alcance de su pregunta).

(Nota: Si usted tiene funciones virtuales, también es necesario añadir un destructor virtual.)

+0

Voy a investigar eso, pero ¿cómo puede hacer que el elemento [0] en la matriz de armas represente una clase u otra? – Sam152

+0

Modifiqué la respuesta para abordar eso. – EboMike

+0

¡Gracias por ser tan útiles! +1. ¿Puedes echar un vistazo a mi edición por casualidad? – Sam152

2

no del todo exacta. Yo usaría punteros, de lo contrario tendrá el efecto de corte. Es decir, la memoria asignada para cada área de esa matriz es solo la memoria suficiente para un arma. Si la ametralladora o el lanzallamas tienen atributos adicionales, "perderán" lo que está contenido en la matriz, porque no hay suficiente memoria. Si utiliza punteros y asigna dinámicamente cada arma en la matriz, no tendrá ningún problema de corte. Por lo tanto, su declaración para la matriz sería weapon* weapons[total weapons]; y cuando declare cada elemento de la matriz, weapons[numweapon]=new flamer(params); No olvide el destructor y no olvide eliminar las variables asignadas dinámicamente.

+0

Vaya, publiqué mi respuesta demasiado tarde. Ebo ya modificado para reflejar la asignación dinámica. –

+0

Soy un principiante aprendiendo por primera vez, estoy bastante feliz de tener los mismos parámetros para ambas armas, pero gracias por darme algo en qué pensar. – Sam152

4
#include <iostream> 

class weapon { 

public: 
    int fireRate; 
    int bulletDamage; 
    int range; 
    int activeBullet; 

public: 
    virtual void fire(void) {std::cout << "machine " << '\n';} 
    virtual ~weapon() {std::cout << "destructor is virtual" << '\n';} 
}; 

class machineGun: public weapon { 
public: 
    void fire(void) {std::cout << "machine gun firing" << '\n';} 
    ~machineGun(void) { std::cout << "machine gun destroyed" << '\n';} 
}; 

class flamer: public weapon { 
public: 
    void fire(void) {std::cout << "flamer firing" << '\n';} 
    ~flamer(void) {std::cout << "flamer destroyed" << '\n';} 
}; 

int main(void) 
{ 
    const int count = 2; 
    weapon *weapons[count]; 

    machineGun *a = new machineGun(); 
    flamer  *b = new flamer(); 

    weapons[0] = a; 
    weapons[1] = b; 

    weapons[0]->fire(); 
    weapons[1]->fire(); 

    delete a; 
    delete b; 

} 
+1

Gracias por ayudarme a entender todo esto. – Sam152

Cuestiones relacionadas