c++ - 如何在父类(super class)方法的参数中使用子类?

标签 c++ header-files

我是 C++ 的新手,我在将指针 vector 传递给对象时遇到问题。具体来说,问题是对象是方法所在类的子类。我收到一个错误:

'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 指针 vector 。

我的问题是:

如果可能,如何在父类(super class)方法的参数中使用子类?

最佳答案

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

您可能想要提供一个接口(interface),每个可绘制元素(包括 Player)都可以实现该接口(interface),然后提供一个能够绘制任何可绘制元素的类型,尤其是潜在的 Player。这样做你会打破循环依赖,设计会更合理。

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

关于c++ - 如何在父类(super class)方法的参数中使用子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11100895/

相关文章:

c++ - 包含 "flint.h"或 "flint/flint.h"是更好的做法

在共享库中调用函数但不在头文件中声明

c - 如何将 .h 和 .o 文件添加到 gcc

c++ - 用=初始化和用{}初始化有什么区别?

c++ - 初始化多 channel OpenCV Mat

c++ - Cocos2d-x v3 : ClippingNode not working on RenderTexture

C++ - 有一个类型能够容纳它的 child

c++ - 使用 std::string 导致 Windows "Entry Point Not Found"

c - 如何从源代码而不是开发包安装 header

c++ - 在什么情况下我们需要包含<cassert>?