C ++ Проблемы с синтаксисом, поэтому класс может передавать данные другим классам - PullRequest
1 голос
/ 24 декабря 2010

Мне не очень повезло в C ++, когда один из моих классов мог видеть / ссылаться / копировать данные из одного из моих других классов, чтобы он мог его использовать.

В основном я получаю ошибку «Ядро» не называет тип или когда я пытаюсь переслать объявление (/1706153/oshibka-x-ne-nazyvaet-tip-v-c) Я получаю поле «Ядро» имеет неполный тип

Я предполагаю, чтоВторая ошибка связана с тем, что класс не инициализируется, возможно, поэтому ему нечего получить? Не знаю :( (см. код внизу)

В моих играх на 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 вместо множества маленьких функцийПередавая данные, я просто говорю glFunctions, кому нужен контекст Device или Rendering, чтобы использовать core.hGameDeviceContext , если это имеет смысл

1 Ответ

1 голос
/ 24 декабря 2010

Проблема в том, что у вас есть

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...