2010-10-01 27 views
0

En C++ j'ai un tableau de pointeurs vers des objets Player et je veux le remplir avec des objets Fickle où Fickle est une classe dérivée de Player. C'est parce que je veux un tableau Player général que je peux remplir avec différents objets de différentes classes qui sont tous dérivés de la classe Player.C++ fill array avec des objets dérivés du type de tableau

Comment est-ce que je peux faire ceci?

je crée un tableau de pointeurs vers des objets Joueur

Player ** playerArray; 

initialize ensuite le tableau à une certaine taille

playerArray = new Player *[numPlayersIn]; 

Mais ce qui suit ne fonctionne pas pour une raison:

playerArray[i] = new Fickle(0); 

Comment remplir le playerArray avec des objets Fickle (Fickel est une classe dérivée de Player)?

Merci.

MISE À JOUR:

Je reçois le message d'erreur (en IDE Eclipse):

expected ';' before 'Fickle' 

Je pense qu'il pourrait être quelque chose à voir avec la définition de Fickle.

Le fichier Fickle.hpp contient:

#pragma once 
#include "player.hpp"; 

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

Est-ce OK ou est-il un problème avec cela?

Le fichier d'en-tête de la classe du joueur a:

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 méthode receive substituera dans Fickle et d'autres classes dérivées de la classe du joueur

MISE À JOUR 2:

OK Je pense que l'erreur est en fait due à une partie différente du code.

joueur définit une méthode receive:

virtual void receive(int otherChoice); 

qui devrait être remplacée par la sous-classe Fickle, mais la définition dans Fickle:

void Fickle::receive(int otherChoice) {} 

donne l'erreur:

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

Mais Je ne sais pas pourquoi c'est parce que recevoir est défini dans la classe Player?

+1

Quelle erreur obtenez-vous? Quelle est la définition de Fickle (première ligne avec les classes de base)? – ybungalobill

+1

Quelle que soit la raison pour laquelle vous n'utilisez pas 'std :: vector'? 'std :: vector ' est assez simple. Encore mieux (puisque vous devez gérer ces pointeurs) serait ['boost :: ptr_vector '] (http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_vector.html) ou 'std :: vector >'. – GManNickG

+1

Que voulez-vous dire, "ne fonctionne pas"? En ce qui concerne les types de pointeurs, cela fonctionne, donc il doit y avoir une erreur ailleurs dans votre code. Est-ce que 'Fickle' a le constructeur requis? Est-ce que '0 <= i

Répondre

3

Bien que vous deviez probablement utiliser un vecteur à la place, il n'y a pas de raison réelle qu'un tableau dynamiquement attribué ne puisse pas fonctionner en.Voici un peu de code de démonstration de travail:

#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; 
} 
+0

Pourquoi le joueur est-il déclaré comme struct ici? Cela fait-il une différence si Player est une classe au lieu d'une structure? –

+0

@ tree-hacker: ça sauve juste de mettre un 'public:'. C'est la seule vraie différence que cela fait. Pour sauver la confusion, j'ai fait les deux classes avec 'public:'. –

0

Est-ce que Fickle a un constructeur qui accepte un type int ou pointeur? Est-il dérivé privé de Player? Sinon, il semble que cela devrait fonctionner.

+0

Oui Fickle possède un constructeur int. Il est dérivé publiquement de Player je pense (voir le code en question) mais je ne suis pas trop sûr des classes dérivées. –

2

On dirait que vous avez oublié un point-virgule à la fin de la classe Fickle:

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

Peut-être un autre endroit. MISE À JOUR 2: Lorsque vous remplacez une fonction virtuelle dans la classe dérivée, vous devez également la déclarer.

+0

Pour une telle erreur commune, il est étonnamment difficile à traquer. –

+0

@Mark Ransom: blâmer le préprocesseur C++. C'est particulièrement difficile quand il vient de la fin de certains inclure. Quand j'étais débutant, j'ai perdu une heure pour suivre cette erreur une fois. – ybungalobill

+0

OK Je ne savais pas que vous deviez également déclarer des fonctions surchargées dans la classe dérivée. –

1

Si ce n'est pas compiler correctement, alors vous n'avez probablement pas #include l'en-tête qui définit Fickle dans le même fichier source que vous avez ce code. Habituellement, une erreur comme celle-ci signifie que le compilateur ne sait pas ce qu'est Fickle.

+0

Oui s'est avéré que c'était l'un des problèmes était grâce. –