circular dependency and classes

I had to do a exercise with classes and this one had me do a circular dependency thing. anyway they pretty much had it step by step to be set like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <vector>
using namespace std;

class Menu;



class MenuItem
{
public:
	MenuItem(string name);
	void add_submenu(Menu submenu);
	string get_name();
	Menu get_submenu();
	bool get_submenu_state();
private:
	string name;
	Menu submenus;
	bool sub;

};

class Menu
{
public:
	Menu();
	void add_menu_item(MenuItem Item);
	int input();
private:
	vector<MenuItem> submenu;
	void display_menu();


};








//---------------------------------------------



Menu::Menu()
{

}

void Menu::add_menu_item(MenuItem item)
{
	submenu.push_back(item);
}

void Menu::display_menu()
{
	for (int i = 0; i < submenu.size(); i++)
	{
		cout << i + 1 << ") " << submenu[i].get_name() << endl;
	}
}

int Menu::input()
{
	int option;
	do
	{
		display_menu();
		cin >> option;
	} while (option < 1 || option > submenu.size());

	if (submenu[option - 1].get_submenu_state())
	{
		return submenu[option - 1].get_submenu().input();
	}
	else
	{
		return option;
	}
}


//-------------------------------------------------------

MenuItem::MenuItem(string name)
{
	this->name = name;
	sub = false;
}

void MenuItem::add_submenu(Menu submenu)
{
	submenus = submenu;
	sub = true;
}

string MenuItem::get_name()
{
	return name;
}

Menu MenuItem::get_submenu()
{
	return submenus;
}

bool MenuItem::get_submenu_state()
{
	return sub;
}


//------------------------------------
int main()
{
	Menu main_menu;
	MenuItem file("file");
	MenuItem newfile("new");
	MenuItem save_as("save as");
	MenuItem print("print");
	Menu sub_menu;
	//sub_menu.add_menu_item(file);
	sub_menu.add_menu_item(newfile);
	sub_menu.add_menu_item(save_as);
	sub_menu.add_menu_item(print);

	MenuItem edit("edit");
	MenuItem window("window");
	file.add_submenu(sub_menu);
	main_menu.add_menu_item(file);
	main_menu.add_menu_item(edit);
	main_menu.add_menu_item(window);
	main_menu.input();

	return 0;
}



This does not work, the IDE complains that the class Menu is not defined when i use it in MenuItem

However when i reverse the order of the classes being declared like this it works:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140

#include <iostream>
#include <vector>
using namespace std;

class MenuItem;





class Menu
{
public:
	Menu();
	void add_menu_item(MenuItem Item);
	int input();
private:
	vector<MenuItem> submenu;
	void display_menu();


};

class MenuItem
{
public:
	MenuItem(string name);
	void add_submenu(Menu submenu);
	string get_name();
	Menu get_submenu();
	bool get_submenu_state();
private:
	string name;
	Menu submenus;
	bool sub;

};






//---------------------------------------------



Menu::Menu()
{

}

void Menu::add_menu_item(MenuItem item)
{
	submenu.push_back(item);
}

void Menu::display_menu()
{
	for (int i = 0; i < submenu.size(); i++)
	{
		cout << i + 1 << ") " << submenu[i].get_name() << endl;
	}
}

int Menu::input()
{
	int option;
	do
	{
		display_menu();
		cin >> option;
	} while (option < 1 || option > submenu.size());

	if (submenu[option - 1].get_submenu_state())
	{
		return submenu[option - 1].get_submenu().input();
	}
	else
	{
		return option;
	}
}


//-------------------------------------------------------

MenuItem::MenuItem(string name)
{
	this->name = name;
	sub = false;
}

void MenuItem::add_submenu(Menu submenu)
{
	submenus = submenu;
	sub = true;
}

string MenuItem::get_name()
{
	return name;
}

Menu MenuItem::get_submenu()
{
	return submenus;
}

bool MenuItem::get_submenu_state()
{
	return sub;
}


//------------------------------------
int main()
{
	Menu main_menu;
	MenuItem file("file");
	MenuItem newfile("new");
	MenuItem save_as("save as");
	MenuItem print("print");
	Menu sub_menu;
	//sub_menu.add_menu_item(file);
	sub_menu.add_menu_item(newfile);
	sub_menu.add_menu_item(save_as);
	sub_menu.add_menu_item(print);

	MenuItem edit("edit");
	MenuItem window("window");
	file.add_submenu(sub_menu);
	main_menu.add_menu_item(file);
	main_menu.add_menu_item(edit);
	main_menu.add_menu_item(window);
	main_menu.input();

	return 0;
}


So why does this work in one class and not the other. The exercise said to declare class Menu; so i can use it in the MenuItem class. I just curious why it works when i do the reverse (class MenuItem; followed by declaring the Menu class).
It's about the object size. In your first example on line 19: How much space is used by the object submenus?

Since Menu does not depend on the size of MenuItem there is no real circular dependency. Therefore you can just change the include order and it works.
My guess would be the same reason you can't do something like this

1
2
3
4
5
void fun(){
cout<<a;
}

Int a=2;
Topic archived. No new replies allowed.