Code DeBug for a State machine (using state pattern)

I need some help to bebug some C++ code. I can't see any obvious errors but my compiler reported 36 errors. I think they are all relating to the first error I'm getting from inside the State class. It says: "changes meaning of 'State' to 'class State' but I'm not sure what that's telling me or what to do to fix it? THNX to anyone who posts a helpful response!

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
141
142
143
144
145
146
#include <iostream>
using namespace std;

class State {
public:
	virtual State * a() = 0;
	virtual State * b() = 0;

	virtual bool valid() {
		return false;
	}
};

class State1 : public State {
	State * a() {
		return new State3;
	}
	State * b(){
		return new State2;
	}
	bool valid() {
		return true;
	}
};

class State2 : public State {
	State * a() {
	    return new State4;
	}
	State * b() {
		return new State1;
	}
};

class State3 : public State {
	State * a() {
		return new State1;
	}
	State * b(){
		return new State4;
	}
};

class State4 : public State {
	State * a() {
	    return new State2;
	}
	State * b() {
		return new State3;
	}
};

class StateMachine {
public:
	State * pS;
	State():pS(new State1){};
	
	void a(){
		State * pTemp = pS;
		pS = pTemp->a();
		delete pTemp;
	}
	void b(){ 
		State * pTemp = pS;
		pS = pTemp->b();
		delete pTemp;
	}
	~State(){
		delete pS;
	}
};

int main () {
    State1 S;
	State * pS = &S;

	pS->a();
	
	{
		const int size = 4;
		char orders[size] = {'a', 'a', 'b', 'b'};
		StateMachine FSA;
		
		for(int i = 0; i < size; i++) {
			switch orders[i]{
			case 'a':
				FSA->a();
				break;
			case 'b':
				FSA->b();
				break;
			}
		}
		
		if(! FSA->valid() ) {
			std::cout << "FSA did not accept valid string 'aabb'!"
		}
	}
	
	{
		const int size = 6;
		char orders[size] = {'a', 'b', 'a', 'b', 'a', 'b'}
		StateMachine FSA;
		
		for(int i = 0; i < size; i++) {
			switch orders[i]{
			case 'a':
				FSA->a();
				break;
			case 'b':
				FSA->b();
				break;
			}
		}
		
		if( FSA->valid() ) {
			std::cout << "FSA accepted invalid string 'ababab'!"
		}
	}
	
	{
		const int size = 8;
		char orders[size] = {'a', 'a', 'b', 'a', 'b', 'a', 'b', 'b'}
		StateMachine FSA;
		
		for(int i = 0; i < size; i++) {
			switch orders[i]{
			case 'a':
				FSA->a();
				break;
			case 'b':
				FSA->b();
				break;
			}
		}
		
		if(! FSA->valid() ) {
			std::cout << "FSA did not accept valid string 'aabababb'!"
		}
	}
	
	//Get a string from the user
	//Do the same kind of thing as in the test cases
	
	return 0;
}
We've (mostly) all ran into the issue of classes that are dependent upon each other. The answer is to split the giant source file that includes all the definitions and code, into separate files. A header and source file for each class, and a source file for main. You use forward declarations for classes not in each file. When you're returning pointers, a pointer is the same size regardless of what you point to. So, you can tell the compiler that something is a class and it can deal with compiling that individual file just knowing it's a pointer to something. Then, everything comes together at link time.

For example, on your line 16, it has no idea what State3 is. Because you have a cyclic dependency (which is necessary sometimes), you have to do it this way.

For more suggestions, google "c++ class interdependence". This should get you moving in the right direction.
One at least partial solution is class forward declaration. Forward declare your classes before declaration of any of them, like this:
1
2
3
4
5
class State;
class State1;
class State2;
class State3;
class StateMachine;
Topic archived. No new replies allowed.