Значение вложенного 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 шт):
Размер объектов класса 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);
}

