C ++ matrice riempimento con oggetti derivato dal tipo di matrice
-
27-09-2019 - |
Domanda
In C ++ ho un array di puntatori a oggetti Player e voglio riempirlo con oggetti Fickle Fickle in cui è una classe che deriva da Player. Questo è perché voglio un generale allineamento Player che posso riempire con diversi oggetti di classi diverse che tutti sono derivate dalla classe Player.
Come posso fare questo?
I creare un array di puntatori a oggetti Player
Player ** playerArray;
Poi inizializzare la matrice di una certa dimensione
playerArray = new Player *[numPlayersIn];
Ma allora quanto segue non funziona per qualche motivo:
playerArray[i] = new Fickle(0);
Come posso riempire la playerArray con oggetti Fickle (Fickel è una classe derivata da lettore)?
Grazie.
UPDATE:
ottengo il messaggio di errore (in Eclipse IDE):
expected ';' before 'Fickle'
Penso che potrebbe essere qualcosa a che fare con la definizione di Fickle.
Il file Fickle.hpp contiene:
#pragma once
#include "player.hpp";
class Fickle: public Player {
public:
// constructor
Fickle(int initChoice){
choice = initChoice;
}
}
È OK o c'è un problema con questo?
Il file di intestazione di classe giocatore ha:
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
};
La ricezione metodo sarà sovrascritto in incostante e altre classi derivate dalla classe Player
UPDATE 2:
OK penso che l'errore è in realtà a causa di una parte diversa del codice.
Player definisce un metodo di ricezione:
virtual void receive(int otherChoice);
che deve essere ignorato dalla sottoclasse Volubile ma la definizione di Fickle:
void Fickle::receive(int otherChoice) {}
dà l'errore:
no 'void Fickle::receive(int)' member function declared in class 'Fickle'
Ma io non so perché questo è perché di ricezione viene definito nella classe Player?
Soluzione
Anche se probabilmente dovrebbe utilizzare un vettore, invece, non c'è vera ragione di un array allocato dinamicamente non possono di lavoro. Ecco un po 'di codice demo funzionante:
#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;
}
Altri suggerimenti
Sembra che hai dimenticato un punto e virgola alla fine della lezione Fickle:
class Fickle: public Player {
// ...
}; // <---- this semicolon
Forse da qualche altra parte.
UPDATE 2:. Quando si ignora una funzione virtuale nella classe derivata è necessario dichiarare anche lì
Se non è la compilazione correttamente, allora probabilmente non ha #include
l'intestazione che definisce Fickle
nello stesso file sorgente si ha quel codice. Di solito un errore come Ciò significa che il compilatore non sa cosa Fickle
è.
non Fickle
dispone di un costruttore che accetta un tipo int
o un puntatore? E 'derivato privatamente da Player
? In caso contrario, sembra che questo dovrebbe funzionare.