Pregunta

En C ++ Tengo una matriz de punteros a objetos Player y quiero llenarlo de objetos voluble donde voluble es una clase que se deriva de jugador. Esto se debe a que quiero una matriz general de jugador que pueda llenar con diferentes objetos de diferentes clases que todos se derivan de la clase Player.

¿Cómo puedo hacer esto?

crear una matriz de punteros a objetos Player

Player ** playerArray;

A continuación, inicializar la matriz a un cierto tamaño

playerArray = new Player *[numPlayersIn];

Pero entonces el siguiente no funciona por alguna razón:

playerArray[i] = new Fickle(0);

¿Cómo puedo llenar el playerArray con objetos voluble (Fickel es una clase derivada de jugador)?

Gracias.

ACTUALIZACIÓN:

Me sale el mensaje de error (en Eclipse IDE):

expected ';' before 'Fickle'

Creo que podría ser algo que ver con la definición de voluble.

El archivo contiene Fickle.hpp:

#pragma once
#include "player.hpp";

class Fickle: public Player {
public:
    // constructor
    Fickle(int initChoice){
        choice = initChoice;
    }
}

¿Está bien o hay un problema con esto?

El archivo de cabecera de la clase jugador tiene:

class Player {
private:

public:
    int getChoice();
int choice; // whether 0 or 1
virtual void receive(int otherChoice); // virtual means it can be overridden in subclases
};

El reciben método será reemplaza en Fickle y otras clases derivadas de la clase del jugador

ACTUALIZACIÓN 2:

OK Creo que el error se debe en realidad a una parte diferente del código.

jugador define un método recibir:

virtual void receive(int otherChoice);

Esto debe ser anulado por la subclase voluble pero la definición de voluble:

void Fickle::receive(int otherChoice) {}

da el error:

no 'void Fickle::receive(int)' member function declared in class 'Fickle'

Pero no sé por qué esto debido a que se recibe es definido en la clase del jugador?

¿Fue útil?

Solución

Si bien es probable que debe utilizar un vector en cambio, no hay ninguna razón real una matriz asignada dinámicamente no puede trabajo. Aquí hay un poco de código de demostración de trabajo:

#include <iostream>

class Player {
public:
    virtual void show() { std::cout << "Player\n"; }
};

class Fickle : public Player {
public:
    virtual void show() { std::cout << "Fickle\n"; }
};

int main() {
    Player **p = new Player *[2];
    p[0] = new Player;
    p[1] = new Fickle;

    for (int i=0; i<2; i++)
        p[i]->show();

    for (int i=0; i<2; i++)
        delete p[i];
    delete [] p;
    return 0;
}

Otros consejos

Parece que se le olvidó un punto y coma al final de la clase voluble:

class Fickle: public Player {
    // ...
}; // <---- this semicolon

Tal vez en otro lugar.

ACTUALIZACIÓN 2:. Cuando se reemplaza una función virtual en la clase derivada debe declarar que allí también

Si no se compilar correctamente, entonces es probable que no #include la cabecera que define Fickle en el mismo archivo de origen que tiene ese código. Por lo general, un error como Eso significa que el compilador no sabe lo que es Fickle.

¿El Fickle tiene un constructor que acepta un tipo int o un puntero? Se derivó de forma privada Player? De lo contrario, parece que esto debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top