如何在超类方法的参数中使用子类? 我对C++非常陌生,而且我有一个问题,把指针传递给对象。具体来说,问题是对象是方法所在类的子类。我得到一个错误: 'Player' was not declared in this scope

如何在超类方法的参数中使用子类? 我对C++非常陌生,而且我有一个问题,把指针传递给对象。具体来说,问题是对象是方法所在类的子类。我得到一个错误: 'Player' was not declared in this scope,c++,header-files,C++,Header Files,Player是Visual的子类,在我的文件Visual.cpp中,我有以下函数,它也在我的头文件中声明 bool Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList) { // Draw Info } 我认为问题在于我的定义是循环的,玩家扩展了视觉,但视觉必须了解玩家,才能处理玩家指针向量 我的问题是: 如果可能,如何在超类方法的参数中使用子类 玩家扩展了视觉,但视觉必须

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

bool Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList) {
    // Draw Info
}
我认为问题在于我的定义是循环的,玩家扩展了视觉,但视觉必须了解玩家,才能处理玩家指针向量

我的问题是:

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

玩家扩展了视觉,但视觉必须了解玩家,才能处理玩家指针向量

按文件:

  • Player.h-包括
    Visual.h
    &将实现移动到实现文件
  • Player.cpp-应该可以
  • Visual.h-向前声明
    Player
  • Visual.cpp-包括
    Player.h
这只是修复了编译错误,但您的设计似乎也有缺陷。如果
Player
源于
Visual
,为什么该方法

Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList)
Visual::DrawStatusInformation(计时器*计时器,标准::向量*播放列表)
存在?我相信你可以用

Visual::DrawStatusInformation(Timer* timer, std::vector<Visual*>* playerList)
Visual::DrawStatusInformation(计时器*计时器,标准::向量*播放列表)
并在
Player
中覆盖它。还有,为什么是
向量*
而不是
向量&

玩家扩展了视觉,但视觉必须了解玩家,才能处理玩家指针向量

按文件:

  • Player.h-包括
    Visual.h
    &将实现移动到实现文件
  • Player.cpp-应该可以
  • Visual.h-向前声明
    Player
  • Visual.cpp-包括
    Player.h
这只是修复了编译错误,但您的设计似乎也有缺陷。如果
Player
源于
Visual
,为什么该方法

Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList)
Visual::DrawStatusInformation(计时器*计时器,标准::向量*播放列表)
存在?我相信你可以用

Visual::DrawStatusInformation(Timer* timer, std::vector<Visual*>* playerList)
Visual::DrawStatusInformation(计时器*计时器,标准::向量*播放列表)

并在
Player
中覆盖它。另外,为什么一个代码>向量*<代码>而不是<代码>向量> <代码>

< p>我会考虑重新设计。继承对is-a关系进行建模,这反过来意味着在您的设计中,
Player
is-a
Visual
,因此它知道如何
draw其他
Player
的状态信息。这似乎合理吗

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


请注意,这不是实现的问题,而是设计的问题。如果你真的觉得这是你的问题的最佳设计,那么你可以把前面的声明和包含在LuChia中已经提到的包含在一起。

< P>我会考虑重新设计。继承对is-a关系进行建模,这反过来意味着在您的设计中,
Player
is-a
Visual
,因此它知道如何
draw其他
Player
的状态信息。这似乎合理吗

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


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

问题是:为什么您的基类要知道它的任何派生类?理想情况下,它不应该。这是您设计中的问题。它不知道什么是
Player
,因此它会给您一个编译错误。您可以在传入子类之前将其强制转换为父类,但是Als基本上是对的,他们说你的架构是错误的和颠倒的。如果DrawStatusInformation也被移动到一个派生类中,并且两个派生类彼此都知道,这会是一个更好的设计吗?或者你认为我会再次遇到同样的问题吗?好吧,不知道你想做什么,很难说!但是我怀疑
DrawStatusInformation
真的属于这个阶级等级之外,如果它是以
Visual
Player
为向量的话。一个只要求类实例绘制其自身状态的方法似乎更适合于一个合理的体系结构。。。但是,如果不深入了解你想做什么,就很难说出任何真正有用的话!问题是:为什么基类应该知道它的任何派生类?理想情况下,它不应该。这是您设计中的问题。它不知道什么是
Player
,因此它会给您一个编译错误。您可以在传入子类之前将其强制转换为父类,但是Als基本上是对的,他们说你的架构是错误的和颠倒的。如果DrawStatusInformation也被移动到一个派生类中,并且两个派生类彼此都知道,这会是一个更好的设计吗?或者你认为我会再次遇到同样的问题吗,