如何在超类方法的参数中使用子类

How can I use a subclass in a parameter of a superclass method?

本文关键字:子类 参数 超类 类方法      更新时间:2023-10-16

我对C++很陌生,我在传递指向对象的指针向量时遇到问题。具体来说,问题是对象是该方法所在的类的子类。我收到错误:

'Player' was not declared in this scope

PlayerVisual的子类,在我的文件Visual中.cpp我有以下函数,该函数也在我的头文件中声明。

bool Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList) {
    // Draw Info
}

我尝试在头文件中向前声明class Player;,但出现错误:

error: invalid use of incomplete type ‘struct Player’
error: forward declaration of ‘struct Player’

我认为问题是我的定义是循环的,玩家扩展了视觉,但视觉必须了解播放器才能处理玩家指针的向量。

我的问题是:

如果可能,如何在超类方法的参数中使用子类?

我会考虑重新设计。继承对 is-a 关系进行建模,这反过来意味着在您的设计中,Player is-a Visual,因此它知道如何DrawStatusInformation其他Player。这看起来合理吗?

您可能希望提供一个接口,每个可绘制元素都实现该接口,包括 Player ,然后提供一个能够绘制任何可绘制内容的类型,特别是可能Player。这样做,你将打破循环依赖,设计将更加合理。

请注意,这不是实现的问题,而是设计的问题。如果你真的觉得这是解决你问题的最佳设计,那么你可以将前向声明与包含结合起来,正如Luchian已经提到的那样。

播放器

扩展了视觉对象,但视觉对象必须了解播放器,以便能够处理玩家指针的向量。

按文件:

  • Player.h - 包含Visual.h并将实现移动到实现文件
  • 播放器.cpp - 应该没问题
  • Visual.h - 向前声明Player
  • 视觉.cpp - 包括Player.h

这只是修复了编译错误,但您的设计似乎也有问题。如果Player是从Visual派生的,为什么该方法

Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList)

存在?我相信你可以用

Visual::DrawStatusInformation(Timer* timer, std::vector<Visual*>* playerList)

并在 Player 中覆盖它。另外,为什么是vector*而不是vector&