C++ 语法有问题,所以一个类可以将数据传递给其他类

标签 c++ class syntax forward-declaration

我在 C++ 中没有太多运气让我的一个类从我的另一个类中查看/引用/复制数据以便它可以使用它。

基本上我收到错误 'Core' does not name a type 或当我尝试转发声明时(http://stackoverflow.com/questions/2133250/does-not-name-a -type-error-in-c) 我得到field 'core' has incomplete type

我猜第二个错误是由于类可能没有真正初始化,所以它什么也得不到?我不知道 :((见底部的代码)

在我的 C# 游戏中,我通常会创建一个“核心”类,然后在其中启动其他类,例如“实体”、“玩家”、“武器”等。当我启动这些其他类时我会通过“this”的类(class)

public WeaponManager c_WeaponManager;
...
c_WeaponManager = new WeaponManager(this);

所以我总是可以从任何地方访问任何类的公共(public)值,只要它通过核心。 例如: 因此,当我通过“武器”类进行更新时,它检测到它击中了玩家,我只需在该类中获取一个函数来...

core.playerClass.deductHealth(damageAmmount);

..或类似的东西。

它让我可以将很多我想全局访问的变量整齐地隐藏在我认为合适的区域。

我知道这不是一种好的编程方法,但我对它相当满意并且我主要从事业余编程,所以我喜欢能够快速访问我的数据而无需官僚的 Get() 和 Set () 函数将数据从一个类传递到另一个类。此外,我仍在摸索头文件,因为它们似乎很麻烦

//-----------[In vid_glinit.h]-------------------
include "core.h"

class Vid_glInit
{
    public:
    RECT glWindowRect;
    Core core;

    Vid_glInit();
    ~Vid_glInit();
    void StartGl(HWND _hGameWindow, int resolutionX, int resolutionY);

    private:
};

//------------[in core.h]----------

include "vid_glinit.h"

class Core
{
    public:
    Vid_glInit vid_glinit(this);

    enum GAME_MODE
    {
        INIT,
        MENUS,
        GAMEPLAY
    };

    GAME_MODE gameMode;
    HWND hGameWindow;
    HGLRC hGameRenderContext;                           // Permanent Rendering Context
    HDC hGameDeviceContext;                         // Private GDI Device Context

    //functions go here
    Core();
    ~Core();
    void testFunc();
    void Run();
    void Update();
    void Render();
    void StartGl(int resoultionX, int resolutionY);

    private:

};

我的目标是,当我启动 OpenGl 时,我没有使用很多小函数来传递数据,而是简单地告诉需要设备或渲染上下文的 glFunctions 使用 core.hGameDeviceContext ,如果那样的话有道理

最佳答案

问题是你有

class Vid_glInit
{
public:
    Core core;

这意味着在此类中内联分配 Core 对象的完整拷贝,并且

class Core
{
public:
    Vid_glInit vid_glinit(this);

这意味着在类中内联分配 Vid_glInit 对象的完整拷贝 - 现在这是循环的,并且无法计算结构的大小。

您可能实际上想通过引用或指针分配至少其中一个,即

class Core
{
public:
    Vid_glInit* vid_glinit; // pointer: access properties as core.vid_glinit->foo
    Vid_glInit& vid_glinit; // reference: properties are core.vid_glinit.foo

在这种情况下,您可以使用 class Vid_glInit; 简单的前向声明,因为它们只是内部指针,指针的大小是固定的,无论其背后的结构如何,即 C++ 可以布局内存中的核心类,无需完全了解 Vid_glInit 结构。

关于C++ 语法有问题,所以一个类可以将数据传递给其他类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4524685/

相关文章:

python - 设置 Python 类属性的正确方法

html - 使元素显示为黄色

ruby-on-rails - 语法错误 : unexpected $end when using if/else if?

algorithm - 如何以编程方式检测 CV 中的漏洞/个人信息(通过语法分析/解析等...)

c++ - QLabel 边框不会与像素图一起显示

c++ - 为什么转换运算符在等效函数只调用一次时调用复制构造函数两次?

c++ - 从内存中提取 double 的字节值

c++ - `std::enable_if` 是函数指针——怎么样?

swift - 我的快速方法没有输出

c++ - for( ... ) 循环索引声明样式