Профил
Loading...
+ Нов въпрос
Smeshan avatar Smeshan 89 Точки

Forward Declaration Renderer

Здравейте,
имам едно питане защо при инклудите в Engine.h:

/* C system icnludes */

/* C++ system icnludes */
#include <cstdint>

/* Third-party icnludes */

/* Own icnludes */
#include "game/Game.h"
#include "sdl_utils/InputEvent.h"
#include "sdl_utils/Monitor.h"

/* Forward Declaration */
struct EngineConfig;
struct Renderer;

class Engine {
...

ми дава грешка по-долу при private member-a Renderer _renderer (Грешката е: incomplete type is not allowed), а:

/* C system icnludes */

/* C++ system icnludes */
#include <cstdint>

/* Third-party icnludes */

/* Own icnludes */
#include "game/Game.h"
#include "sdl_utils/InputEvent.h"
#include "sdl_utils/Monitor.h"
#include "sdl_utils/Renderer.h"

/* Forward Declaration */
struct EngineConfig;

class Engine {
..

не ми дава?
Нали в първия вариант му казвам, че това ще е структура и после вкарвам Header-a само в cpp-то?

Нещо ми избягва логиката или пропускам нещо просто (за което се извинявам ако е казвано).

Благодаря предварително,
Илиян

Тагове:
2
C++ Applications Development
MartinBG avatar MartinBG 3972 Точки
Best Answer

Forward declaration работи само ако типа се използва като пойнтър или референция, т.е. трябва да имаме Renderer* _renderer или Renderer& _renderer

1
bonev_st avatar bonev_st 11 Точки

И ако е статична променлива.

0
j.petrov_90 avatar j.petrov_90 370 Точки

Привет, Илиян,

MartinBG го е отговорил точно и ясно с едно изречение.

Forward declaration-а работи сами при пойнтър и референция.
В момента, в който имаш обект - имаш нужда от header-а, защото compiler-а има нужда от имплементацията на обекта (по точно на size-а му).

Ако се замислиш - ти трябва да дадеш обещание, че където и да се include-не твоя хедър - компилацията на съответния translation unit ще мине.
Когато имаш само пойнтър това е вярно.
Когато обаче имаш обект - този обект ще бъде създаден в няколко (поне един) translation unit. Било то в конструктора на класа ти или в някоя друга функция.

Затова компилатора ти казва, не мога да създам нещо, което има "incomplete type".

Поздрави 

2