Program generujący sekwencję binarną. Dziwny błąd kompilacji.

0
#include <iostream>

using namespace std;

class State0;
class State1;

string s = "";

class State0
{
public:
	State0(){}
	static bool active;
	static void NextState(int x, int y)
	{
		if (x == 0 && y == 0)
			s += "0";
		if (x == 0 && y == 1)
			s += "1";
		if (x == 1 && y == 0)
			s += "1";
		if (x == 1 && y == 1)
		{
			s += "0";
			active = false;
			State1::active = true;
		}
	}
};

class State1
{
public:
	State1(){}
	static bool active;
	static void NextState(int x,int y)
	{
		if (x == 0 && y == 1)
			s += "0";
		if (x == 1 && y == 0)
			s += "0";
		if (x == 1 && y == 1)
			s += "1";
		if (x == 0 && y == 0)
		{
			s += "1";
			active = false;
			State0::active = true;
		}
	}
};

int main()
{
	int i = 5;
	State0::active = true;
	State1::active = false;
	while (i--)
	{
		int x, y; 
		cout << "Podaj x: ";
		cin >> x;
		cout << "Podaj y: ";
		cin >> y;
		if (State0::active == true)
			State0::NextState(x, y);
		if (State1::active == true)
			State1::NextState(x, y);

	}
	return 0;
} 

Dlaczego program mi się nie kompiluje? Przecież mam umieszczone deklaracje klasy na górze, a mam błąd: use of undefined type "State1". Piszę w Visual Studio.

2

Bo tutaj:

        if (x == 1 && y == 1)
        {
            s += "0";
            active = false;
            State1::active = true;
        }

Nie jest znana definicja klasy State1 i nie wiadomo jakie ta klasa ma pola. Tutaj masz widoczna póki co tylko deklaracje zapowiadającą która mówi że State1 określa klasę, ale nic więcej.
W takiej sytuacji powinieneś nie mieć żadnej implementacji metod wewnątrz klasy, tylko najpierw dwie deklaracje a potem dopiero definicje metod.

0

Zrobiłem tak jak mówisz i mi się dalej nie kompiluje. Wywala mi błąd "Unresolved externals symbols".

#include <iostream>

using namespace std;

string s = "";

class State0
{
public:
	State0(){}
	static bool active;
	static void NextState(int x, int y);
};

class State1
{
public:
	State1(){}
	static bool active;
	static void NextState(int x, int y);
};

void State0::NextState(int x, int y)
{
	if (x == 0 && y == 0)
		s += "0";
	if (x == 0 && y == 1)
		s += "1";
	if (x == 1 && y == 0)
		s += "1";
	if (x == 1 && y == 1)
	{
		s += "0";
		active = false;
		State1::active = true;
	}
}

void State1::NextState(int x, int y)
{
	if (x == 0 && y == 1)
		s += "0";
	if (x == 1 && y == 0)
		s += "0";
	if (x == 1 && y == 1)
		s += "1";
	if (x == 0 && y == 0)
	{
		s += "1";
		active = false;
		State0::active = true;
	}
}

int main()
{
	int i = 5;
	State0::active = true;
	State1::active = false;
	while (i--)
	{
		int x, y; 
		cout << "Podaj x: ";
		cin >> x;
		cout << "Podaj y: ";
		cin >> y;
		if (State0::active == true)
			State0::NextState(x, y);
		if (State1::active == true)
			State1::NextState(x, y);

	}
	return 0;
} 
1

Teraz błąd polega na tym że zmienne statyczne w C++ muszą być gdzieś zdefiniowane i w szczególności musi to być odpowiedni zakres widoczności. U ciebie zmienne active są widoczne tylko wewnątrz main() a co za tym idzie nie są widoczne w definicji metod twoich klas ;] Quick-fix to dodać po prostu

bool State0::active = true;
bool State1::active = false;

za deklaracjami twoich klas a przed definicjami metod

W wieloplikowym projekcie dałbyś w pliku .cpp z defincjami metod te zmienne jako extern a potem zdeklarował w jakimś odpowiednim miejscu na przykład.

0

Ma sens zamienić to:

void State0::NextState(int x, int y)
{
    if (x == 0 && y == 0)
        s += "0";
    if (x == 0 && y == 1)
        s += "1";
    if (x == 1 && y == 0)
        s += "1";
    if (x == 1 && y == 1)
    {
        s += "0";
        active = false;
        State1::active = true;
    }
}

na:

void State0::NextState(int x, int y)
  {
   const state[]="0110";
   int val=(y<<1)|x;
   s+=state[val];
   active=(val!=3)
   State1::active=!active;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1