C ++ заполнить массив объектами, производными от типа массива - PullRequest
1 голос
/ 02 октября 2010

В C ++ у меня есть массив указателей на объекты Player, и я хочу заполнить его объектами Fickle, где Fickle - это класс, производный от Player. Это потому, что мне нужен общий массив Player, который я могу заполнить различными объектами из разных классов, все они являются производными от класса Player.

Как я могу это сделать?

Я создаю массив указателей на объекты Player

Player ** playerArray;

Затем инициализируйте массив до определенного размера

playerArray = new Player *[numPlayersIn];

Но тогда по какой-то причине следующее не работает:

playerArray[i] = new Fickle(0);

Как я могу заполнить playerArray объектами Fickle (Fickel - это класс, производный от Player)?

Спасибо.

UPDATE:

Я получаю сообщение об ошибке (в Eclipse IDE):

expected ';' before 'Fickle'

Я думаю, что это может быть связано с определением Фикла.

Файл Fickle.hpp содержит:

#pragma once
#include "player.hpp";

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

Это нормально или есть проблема с этим?

Файл заголовка класса Player имеет:

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
};

Метод приема будет переопределен в Fickle и других классах, производных от класса Player

ОБНОВЛЕНИЕ 2:

ОК. Я думаю, что ошибка на самом деле из-за другой части кода.

Player определяет метод receive:

virtual void receive(int otherChoice);

Это должно быть отменено подклассом Fickle, но определением в Fickle:

void Fickle::receive(int otherChoice) {}

выдает ошибку:

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

Но я не знаю, почему это происходит, потому что в классе Player определено получение?

Ответы [ 4 ]

3 голосов
/ 02 октября 2010

Хотя вам, вероятно, следует использовать вектор вместо этого, нет реальной причины, по которой динамически размещенный массив не может работать.Вот немного рабочего демонстрационного кода:

#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;
}
2 голосов
/ 02 октября 2010

Похоже, вы забыли точку с запятой в конце класса Fickle:

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

Возможно, где-то еще.

ОБНОВЛЕНИЕ 2: когда вы переопределяете виртуальную функцию в производном класседолжен объявить это и там.

1 голос
/ 02 октября 2010

Если он не компилируется правильно, то вы, вероятно, не #include заголовок, который определяет Fickle в том же исходном файле, у которого есть этот код.Обычно такая ошибка означает, что компилятор не знает, что такое Fickle.

0 голосов
/ 02 октября 2010

Имеет ли Fickle конструктор, который принимает int или тип указателя? Это в частном порядке от Player? В противном случае, похоже, что это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...