Значение вложенного enum (вложенного в Класс 1) необходимо передать в параметры конструктора Класса 2, где оба класса используют объекты друг друга

В проекте присутствует 3 Файла:

  • main.cpp (в нём создаются объекты классов A, B)
  • Class A.h (реализация класса A + реализация вложенного в класс A перечисления Color)
  • Class B.h (реализация класса B + реализация вложенного в класс B перечисления Site)

В проекте присутствует проблема того, что Конструктор Класса A принимает в параметры - адрес памяти объекта класса B, значение вложенного enum[Site] Класса[B]. Адрес памяти объекта класса B он способен принять, а значение вложенного enum Класса

Конструктор класса A способен принимать в параметры указатель на объект класса B, но не его вложенные конструкции (например, как enum в данном примере). Иными словами, если убрать абсолютно всё, что связано с вложенными enum - проект скомпилируется.

Есть ли способ сделать так, чтобы:

  • Класс A смог использовать (увидеть) вложенный enum Класса B (enum class Site)?
  • Класс B смог использовать (увидеть) вложенный enum Класса A (enum class Color)?

При всём этом, классы A и B используют объекты друг друга.

// main.cpp

#include "Class A.h"
#include "Class B.h"

int main()
{
    B objB((A*)nullptr, A::Color::Black);
    A objA((B*)nullptr, B::Site::X);
}

// Class A.h

#pragma once

extern class B;

class A
{
public:
    enum class Color
    {
        Red,
        Black
    };

    B* objectB;
    B::Site site;

    A(B* pointB, B::Site site)
    {
        objectB = pointB;
        this->site = site;
    }
};

// Class B.h

#pragma once

extern class A;

class B
{
public:
    enum class Site
    {
        X,
        Y
    };

    A* objectA;
    A::Color color;

    B(A* pointA, A::Color color)
    {
        objectA = pointA;
        this->color = color;
    }
};

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

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

введите сюда описание изображения

Размер объектов класса A зависит от реального размера типа enum B::Site. Вижу решение только если разделить классы A,B с родителями в которых только enum определения.

введите сюда описание изображения

A_Color.h

#pragma once

class A_Color
{
public:
    enum class Color
    {
        Red,
        Black
    };
};

B_Site.h

#pragma once

class B_Site
{
public:
    enum class Site
    {
        X,
        Y
    };
};

class A.h

#pragma once

// error: a storage class can only be specified for objects and functions
/*extern*/ class B;

# include "A_Color.h"
# include "B_Site.h"

class A : public A_Color
{
public:

    B* objectB;
    B_Site::Site site;

    A(B* pointB, B_Site::Site site)
    {
        objectB = pointB;
        this->site = site;
    }
};

Class B.h

#pragma once

// error: a storage class can only be specified for objects and functions
/*extern*/ class A;

# include "A_Color.h"
# include "B_Site.h"

class B:public B_Site
{
public:

    A* objectA;
    A_Color::Color color;

    B(A* pointA, A_Color::Color color)
    {
        objectA = pointA;
        this->color = color;
    }
};

main.cpp

// g++ -Wall -Wextra -Wpedantic -Winline -std=c++17 main.cpp -Os -o main
#include "Class A.h"
#include "Class B.h"

int main()
{
    B objB((A*)nullptr, A::Color::Black);
    A objA((B*)nullptr, B::Site::X);
}
→ Ссылка