2012-06-19 95 views
0

我对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指针的矢量。

我的问题是:

如果可能的话,我怎么能在一个超类方法的参数使用一个子类?

+2

问题是:为什么基类应该知道它的任何派生类?理想情况下,它不应该。这是你设计中的问题。 –

+0

它不知道'Player'是什么,所以它给你一个编译错误。 – 2012-06-19 12:29:16

+0

你可以在通过它们之前将你的后代类别转换为它们的父类型,但基本上Als在他们说你的架构是错误和颠倒的时候是正确的。 – Rook

回答

1

Player extends Visual but Visual must know about Player in order to be able to deal with a vector of Player pointers.

通过文件:

  • Player.h - 包括Visual.h &举措的实施,以实现文件
  • Player.cpp - 应该确定
  • Visual.h - 正式宣布Player
  • Visual.cpp - 包括Player.h

这只是修复编译错误,但你的设计似乎也有问题。如果PlayerVisual得出,为什么该方法

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

存在吗?我相信你可以用

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

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

+2

@我有,你看过答案吗?我说他应该在实现文件中包含Player.h。 –

+0

OP没有显示定义'class Visual'的头文件,你的回答只是假设'Player'类型正在被使用,以至于它的内存布局不需要在定义'Visual'的头文件中知道,很显然,这里的问题在于OP有一个糟糕的(实际上是错误的)设计。当我降低评论并​​添加评论时,你的回答没有任何提及,你可能稍后会隐身编辑它,但对这个问题的回答显然是变化的在设计中不是解决方法。 –

+0

OP的整个设计很臭......为什么要传递一个Timer指针和Visual指针?应该是const引用。 – 2012-06-19 12:40:16

3

我会考虑重新设计。继承模型是,一个关系,而这又意味着,在您的设计,Player是,一个Visual,因此它知道其他Player一个如何DrawStatusInformation。这似乎是合理的吗?

您可能想要提供一个接口,每一个元素就是绘制工具,包括Player,然后提供一个类型,是能够得出任何是绘制,特别是潜在的Player秒。这样做,你会打破循环依赖,设计会更加健全。

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

+0

+1建议修复真正的问题而不是解决方法。前向声明的解决方法迟早会引起痛苦。 –

相关问题