在C ++我有指针数组到播放器对象和要与善变对象,其中善变是从播放派生的类来填充它。这是因为我想一般的播放器阵列,我可以与所有从Player类来源于不同类不同的对象填写。

我怎样才能做到这一点?

创建到播放器对象

的指针数组
Player ** playerArray;

然后初始化数组到一定大小

playerArray = new Player *[numPlayersIn];

但随后以下确实由于某种原因不工作:

playerArray[i] = new Fickle(0);

如何填充playerArray与善变对象(Fickel是从播放派生的类)?

感谢。

更新:

我得到的错误消息(在Eclipse IDE):

expected ';' before 'Fickle'

我想这可能是是与善变的定义。

在Fickle.hpp文件包含:

#pragma once
#include "player.hpp";

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

这是OK还是有与此一问题?

在播放器类的头文件有:

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

在接收方法将被覆盖在菲科尔,并从播放器类派生的其他类

更新2:

行我认为错误实际上是由于代码的不同部分。

播放器定义了一个方法得到:

virtual void receive(int otherChoice);

这应该是重写由子类善变但在菲科尔定义:

void Fickle::receive(int otherChoice) {}

给出了错误:

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

但我不知道这是为什么,因为接收在播放器类中定义?

有帮助吗?

解决方案

虽然你也许应该使用一个载体,而不是,有没有真正的理由一个动态分配的数组的不能的工作。这里有一点工作演示代码:

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

其他提示

看起来你在菲科尔类的端忘记分号:

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

也许别的地方。

更新2:当你在派生类重写虚函数必须声明它有太

如果它不能正常编译,那么你可能没有#include标题定义相同的源文件中Fickle你的代码。通常这样的装置的一个错误,编译器不知道Fickle是什么。

确实Fickle有一个接受int或指针类型构造函数?难道是私下从Player衍生?否则,它看起来像这应该工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top