【发布时间】:2011-04-20 01:40:01
【问题描述】:
在 C++ 中,我有一个指向 Player 对象的指针数组,并希望用 Fickle 对象填充它,其中 Fickle 是从 Player 派生的类。这是因为我想要一个通用的 Player 数组,我可以填充来自不同类的不同对象,这些对象都派生自 Player 类。
我该怎么做?
我创建了一个指向 Player 对象的指针数组
Player ** playerArray;
然后将数组初始化为一定的大小
playerArray = new Player *[numPlayersIn];
但是由于某种原因,以下内容不起作用:
playerArray[i] = new Fickle(0);
如何用 Fickle 对象填充 playerArray(Fickel 是从 Player 派生的类)?
谢谢。
更新:
我收到错误消息(在 Eclipse IDE 中):
expected ';' before 'Fickle'
我认为这可能与 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
};
receive 方法将在 Fickle 和其他从 Player 类派生的类中被覆盖
更新 2:
好的,我认为错误实际上是由于代码的不同部分造成的。
播放器定义了一个方法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 类中定义了接收?
【问题讨论】:
-
你得到什么错误? Fickle 的定义是什么(基类的第一行)?
-
有什么理由不使用
std::vector?std::vector<Player*>很简单。更好的(因为您需要管理这些指针)是boost::ptr_vector<Player>或std::vector<shared_ptr<Player>>。 -
“不起作用”是什么意思?就指针类型而言,它确实有效,因此代码中的其他地方一定有一些错误。
Fickle是否有所需的构造函数?是0 <= i < numPlayersIn? -
Fickle 是否源自 single 玩家基础(即没有多重继承)?
-
@ybungalobill:无关紧要。即使有多重继承,这个想法也应该有效。
标签: c++ arrays pointers polymorphism derived-class