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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top