0

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

'Player' was not declared in this scope

Player是一个子类,Visual在我的文件 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 指针向量。

我的问题是:

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

4

2 回答 2

3

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

您可能希望提供一个接口,每个可绘制元素都实现,包括Player,然后提供一种能够绘制任何可绘制对象的类型,Player尤其是可能的 s 。这样做你会打破循环依赖,设计会更合理。

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

于 2012-06-19T12:34:07.843 回答
1

Player 扩展了 Visual,但 Visual 必须了解 Player 才能处理 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(Timer* timer, std::vector<Visual*>* playerList)

并将其覆盖在Player. 另外,为什么 avector*而不是 a vector&

于 2012-06-19T12:28:41.800 回答