我是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指针的向量。
我的问题是:
如果可能,我如何在超类方法的参数中使用子类?
答案 0 :(得分:3)
我会考虑重新设计。继承模拟 is-a 关系,这反过来意味着在您的设计中,Player
是-a Visual
,因此它知道如何到其他DrawStatusInformation
的{{1}}。这看起来合情合理吗?
您可能希望提供一个可绘制的每个元素实现的接口,包括Player
,然后提供一个能够绘制任何可绘制的元素的类型,并且可能{特别是{1}}。这样做可以打破循环依赖,设计会更健全。
请注意,这不是实现的问题,而是设计的问题。如果您真的觉得这是针对您的问题的最佳设计,那么您可以将前向声明与Luchian已经提及的包含结合起来。
答案 1 :(得分:1)
Player扩展Visual但Visual必须知道Player才能处理Player指针的向量。
按文件:
Visual.h
&amp;将实现移至实施文件Player
Player.h
这只是修复了编译错误,但你的设计似乎也有问题。如果Player
来自Visual
,为什么方法
Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList)
存在吗?我相信你可以用
替换它Visual::DrawStatusInformation(Timer* timer, std::vector<Visual*>* playerList)
并在Player
中覆盖它。另外,为什么是vector*
而不是vector&
?