Ошибка при передаче объекта класса в конструктор другого по ссылке

Я попытался указать в качестве аргумента для конструктора одного класса ссылку на другой класс, определенный в другом файле:

Camera.h

#pragma once
#include <cmath>
#define M_PI 3.14159265358979323846
#include "MoveMatrix.h"
#include "MainRender.h"
#include <SFML/Graphics.hpp>

class Camera
{
public:
    nc::NdArray <float> position_of_camera;
    nc::NdArray <float> forward_cam;
    nc::NdArray <float> up_cam;
    nc::NdArray <float> right_cam;

    float h_visibility;
    float v_visibility;

    float near_scene;
    float far_scene;

    float cZ;
    float cY;
    float cX;

    Camera(MainRender &render, float cx, float cy, float cz);

    nc::NdArray <float> translate_camera();
    nc::NdArray <float> rotate_camera();
    nc::NdArray <float> space_of_camera_matrix();
};

MainRender.h

#pragma once
#include <SFML/Graphics.hpp>
#include <iostream>
#include "3DObjectDescription.h"
#include "Camera.h"
#include "Projection.h"
#include "MoveMatrix.h"
#include <NumCpp.hpp>

class MainRender
{
public:
    sf::RenderWindow window;

    float RenderX;
    float RenderY;

    void create_objects_on_scene();
    void init();

    void draw();

    void main_loop();
};

На этапе компиляции ошибка:

error: expected ')' before '&' token

Я не знаю в чем причина ошибки, надеюсь, то Вы поможете разобраться!


Ответы (1 шт):

Автор решения: AlexGlebe

Вы пытаетесь определить класс Camera только после определения класса MainRender. И определить MainRender только после Camera. Происходит циклическая зависимость. С помощником #pragma once происходит такой порядок :

#include "MainRender.h"
  # include "Camera.h"
    #include "MainRender.h"

и стоп , class MainRender так и не будет определён для класса Camera.

Решается "предварительным" объявлением класса вместо полного.

Camera.h

// #include "MainRender.h"
class MainRender ;

MainRender.h

// #include "Camera.h"
// даже предварительного объявления пока не нужно

спасибо быстрому совету Fat-Zer

→ Ссылка