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

时间:2012-06-19 12:25:49

标签: c++ header-files

我是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’

我认为问题是我的定义是循环的,Player扩展Visual但Visual必须知道Player才能处理Player指针的向量。

我的问题是:

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

2 个答案:

答案 0 :(得分:3)

我会考虑重新设计。继承模拟 is-a 关系,这反过来意味着在您的设计中,Player 是-a Visual,因此它知道如何到其他DrawStatusInformation的{​​{1}}。这看起来合情合理吗?

您可能希望提供一个可绘制的每个元素实现的接口,包括Player,然后提供一个能够绘制任何可绘制的元素的类型,并且可能{特别是{1}}。这样做可以打破循环依赖,设计会更健全。

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

答案 1 :(得分:1)

  

Player扩展Visual但Visual必须知道Player才能处理Player指针的向量。

按文件:

  • Player.h - 包括Visual.h&amp;将实现移至实施文件
  • Player.cpp - 应该没问题
  • Visual.h - 转发声明Player
  • Visual.cpp - 包括Player.h

这只是修复了编译错误,但你的设计似乎也有问题。如果Player来自Visual,为什么方法

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

存在吗?我相信你可以用

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

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