我正在研究一种2D世界块中的玩家的模拟。许多块对象存储在向量中,并且每个块对象都有一个成员,该成员是对该向量的引用,因此每个对象可以遍历其他对象以处理诸如冲突之类的事情。为了简化玩家对物理的物理,我让Player类继承了Block类。虽然这确实使物理变得更加简单,但我遇到了在从向量引用播放器时无法调用播放器成员函数的问题。
以下是这些类的一些简化版本:
class Block{
private:
std::vector<Block>& blocks;
public:
Block(std::vector<Block>& b) : blocks(b) {}
};
class Player : public virtual Block{
public:
Player(std::vector<Block>& b) : Block(b) {}
void player_only_function();
};
std::vector<Block> blocks;
Player player(blocks);
blocks.push_back(player);
blocks[0].player_only_function(); // This line in incorrect
有一种简单的方法来解决这个问题吗?
答案 0 :(得分:0)
如果您只有Block
个对象的向量,那么当玩具推回您的Player
对象时,您就会对象切片,这是不可能的。< / p>
相反,你必须使用指针和名为 downcasting 的东西。像
std::vector<Block*> blocks;
blocks.push_back(new Player(blocks));
static_cast<Player*>(blocks[0])->player_only_function();
但是,您必须要小心,您所做的转发实际上是有效的,并且blocks[0]
是指向Player
对象的指针。