如何在超类方法的参数中使用子类
How can I use a subclass in a parameter of a superclass method?
我对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’
我认为问题是我的定义是循环的,玩家扩展了视觉,但视觉必须了解播放器才能处理玩家指针的向量。
我的问题是:
如果可能,如何在超类方法的参数中使用子类?
我会考虑重新设计。继承对 is-a 关系进行建模,这反过来意味着在您的设计中,Player
is-a Visual
,因此它知道如何DrawStatusInformation
其他Player
。这看起来合理吗?
您可能希望提供一个接口,每个可绘制元素都实现该接口,包括 Player
,然后提供一个能够绘制任何可绘制内容的类型,特别是可能Player
。这样做,你将打破循环依赖,设计将更加合理。
请注意,这不是实现的问题,而是设计的问题。如果你真的觉得这是解决你问题的最佳设计,那么你可以将前向声明与包含结合起来,正如Luchian已经提到的那样。
播放器扩展了视觉对象,但视觉对象必须了解播放器,以便能够处理玩家指针的向量。
按文件:
-
Player.h - 包含
Visual.h
并将实现移动到实现文件 - 播放器.cpp - 应该没问题
-
Visual.h - 向前声明
Player
-
视觉.cpp - 包括
Player.h
这只是修复了编译错误,但您的设计似乎也有问题。如果Player
是从Visual
派生的,为什么该方法
Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList)
存在?我相信你可以用
Visual::DrawStatusInformation(Timer* timer, std::vector<Visual*>* playerList)
并在 Player
中覆盖它。另外,为什么是vector*
而不是vector&
?
相关文章:
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 在子类函数覆盖中省略具有默认值的参数
- 将方法参数类型更改为子类中的派生类
- 获取参数的子类
- 无法将参数 3 从 'const QGraphicsItem *' 转换为 'const QObject *',这是指针,对象是 QGraphicsObject 的子类
- 子类化 std::thread:构造器中可变参数模板函数的问题
- 子类作为模板模板基类的模板参数,而该类别又是子类函数参数
- 在子类中定义可变参数函数专用化
- 是否有必要调用父构造函数而不使用子类构造函数的参数?
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- 类型的C 参数与父母和子类的类型参数不相容
- 将子类作为构造函数中的参数
- 如何在子类方法中更改参数
- c++将子类作为参数传递
- C++ 不同的子类需要不同的参数
- 将基类 2 参数构造函数调用到子类 1 参数构造函数中
- C++-使指向超类的指针与函数中的子类参数匹配
- CRTP+可变模板+提取CRTP子类参数