C ++语法有问题,因此类可以将数据传递给其他类

时间:2010-12-24 06:45:12

标签: c++ class syntax forward-declaration

我没有很多运气在C ++中获取我的一个类来查看/引用/复制其他类中的数据,以便它可以使用它。

基本上我收到错误'Core'没有命名类型或当我尝试转发声明时(http://stackoverflow.com/questions/2133250/does-not-name-a -type-error-in-c)我得到字段'core'的类型不完整

我猜测第二个错误是由于该类可能未真正初始化,所以它没有任何结果?我不知道:((见底部代码)

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

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

所以我可以随时随地访问任何类的公共值,只要它通过核心。 例如: 因此,当我通过'武器'类进行更新,并且它检测到它击中了玩家时,我只是在该类中获得一个函数...

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时,而不是有很多小函数来传递数据我只需告诉需要Device或Rendering上下文的glFunction使用 core.hGameDeviceContext ,如果是有道理

1 个答案:

答案 0 :(得分:1)

问题是你有

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 ++可以在内存中布置Core类而不用完全了解Vid_glInit结构。