Błędy po podziale projektu na pliki

0

Witam,

aktualnie piszę projekt prostej gry konsolowej. Z oczywistych względów konieczny jest podział kodu na wiele plików. Szczerze mówiąc nie miałem bladego pojęcia jak się za to zabrać i w przypływie głupoty napisałem cały projekt w plikach nagłówkowych. Wszystko działało dobrze, ale dopiero zagłębienie się w temat uświadomiło mnie, że część kodu powinna być w plikach źródłowych, a część w nagłówkowych. Przerobiłem więc cały projekt i niestety obecnie nie działa. Program nie kompiluje się i wyrzuca ponad 800 błędów (głównie "Error 145 error C3861: identifier not found" i błędy wynikające z tego, że coś nie jest rozpoznane).

Przykładowy plik nagłówkowy z mojego projektu:

#pragma once
#ifndef Header_h
#define Header_h

class Liczniki
{
	friend class Mieszkanie;

	float Woda;
	float Gaz;
	float Prad;
	float Ogrzewanie;

public:

	Liczniki();
	void ZmienWoda(const float woda);
	void ZmienGaz(const float gaz);
	void ZmienPrad(const float prad);
	void ZmienOgrzewanie(const float ogrzewanie);
	float WyswietlWoda() const;
	float WyswietlGaz() const;
	float WyswietlPrad() const;
	float WyswietlOgrzewanie() const;
	void ZerujLiczniki();
};

#endif

i przykładowy kod źródłowy:

#include "stdafx.h"
#include "Header.h"
#include "Liczniki.h"

Liczniki::Liczniki() : Woda(0), Gaz(0), Prad(0), Ogrzewanie(0) { }

void Liczniki::ZmienWoda(const float woda)
{
	Woda += woda;
}

... 

Plik Header.h:

#include <stdio.h>
#include <string.h>
#include <sstream>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <time.h>
#include <conio.h>
#include <windows.h>
#include <string>
#include <iomanip>
#include <fstream>

using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::fixed;
using std::setprecision;
using std::ofstream;
using std::ifstream;
using std::fstream;
using std::stringstream;

Nie liczę, że ktokolwiek będzie nawet próbował analizować mój kod, bo w sumie jest tego z 50 plików. Chodzi mi raczej o to, na co powinienem zwrócić uwagę szukając błędu.

Z góry dziękuję za wszystkie odpowiedzi.

//edit. W moim projekcie mam sporo klas dziedziczących z innych - jeśli to może być jakieś naprowadzenie.

0

Pokaż jeden przykładowy plik h + źródło + błąd, bo tak to mozemy z fusów najwyżej wróżyć...

0

Poniżej przykładowe pliki.

Klasa "Mieszkanie" zawiera pola zbudowane przy pomocy m. in. klasy "Mieszkanie". W wypadku każdego błąd jest ten sam, np.: "'Mieszkanie': identifier not found"

#pragma once
#ifndef Header_h
#define Header_h

#include "Mieszkanie.h"
#include "Piwnica.h"
#include "Korytarz.h"
#include "Schody.h"
#include "Winda.h"

class Budynek
{
	unsigned int IloscPieter;
	unsigned int IloscMieszkanNaPietrze;
	
	vector <Mieszkanie> Mieszkanie_;
	vector <Korytarz> Korytarze;
	vector <Schody> Schody_;
	vector <Winda> Windy;
	vector <Piwnica> Piwnice;

public:

	Budynek(const unsigned int iloscpieter, const unsigned int iloscmieszkannapietrze, const float powierzchnia, const unsigned int liczbapokoi);
	unsigned int WyswietlIloscPieter();
	unsigned int WyswietlIloscMieszkanNaPietrze();
	vector <Mieszkanie> & ZwrocMieszkanie();
	vector <Korytarz> & ZwrocKorytarz();
	vector <Schody> & ZwrocSchody();
	vector <Winda> & ZwrocWinda();
	vector <Piwnica> & ZwrocPiwnica();
};

#endif

Poniżej zamieszczam pliki Mieszkanie.h i Mieszkanie.cpp

#pragma once
#ifndef Header_h
#define Header_h

#include "Mieszkaniec.h"
#include "Pomieszczenie.h"
#include "Liczniki.h"

class Mieszkanie
{
	float Powierzchnia;
	unsigned int MaxIloscMieszkancow;
	vector <Mieszkaniec> Mieszkancy;
	vector <Pomieszczenie> Pomieszczenia;
	Liczniki Licznik;

public:

	Mieszkanie(const float powierzchnia, const unsigned int liczbapokoi);
	void DodajMieszkanca(const string imie, const string nazwisko, const float wiek, const unsigned int zadowolenie, const unsigned int uciazliwosc);
	void UsunMieszkanca(const string imie, const string nazwisko, const float wiek);
	void EksmitujMieszkancow();
	vector<Mieszkaniec> & ZwrocMieszkancy();
	Liczniki & ZwrocLicznik();
	vector<Pomieszczenie> & ZwrocPomieszczenia();
	unsigned int WyswietlMaxIloscMieszkancow();
};

#endif
#include "stdafx.h"
#include "Header.h"
#include "Mieszkanie.h"

Mieszkanie::Mieszkanie(const float powierzchnia, const unsigned int liczbapokoi) : Powierzchnia(powierzchnia), MaxIloscMieszkancow((int)(Powierzchnia/20))
{
	for(unsigned int i = 0; i < liczbapokoi; ++i) 
	{ 
		srand(time(NULL));
		Pomieszczenia.push_back(Pomieszczenie(powierzchnia/liczbapokoi, rand()%10 + 90, rand()%10 + 90, rand()%10 + 90)); 
	}
}

void Mieszkanie::DodajMieszkanca(const string imie, const string nazwisko, const float wiek, const unsigned int zadowolenie, const unsigned int uciazliwosc)
{
	if(Mieszkancy.size() < MaxIloscMieszkancow) { Mieszkancy.push_back(Mieszkaniec(imie, nazwisko, wiek, zadowolenie, uciazliwosc)); }
	else 
	{ 
		cout<<"W mieszkaniu nie ma juz wiecej miejsca..."<<endl;		
		_getch();
	}
}

void Mieszkanie::UsunMieszkanca(const string imie, const string nazwisko, const float wiek)
{
	for(unsigned int i = 0; i < Mieszkancy.size(); ++i)
	{
		if(Mieszkancy[i].WyswietlImie() == imie)
		{
			if(Mieszkancy[i].WyswietlNazwisko() == nazwisko)
			{
				if(Mieszkancy[i].WyswietlWiek() == wiek)
				{
					if(Mieszkancy.size() > 1)
					{
						Mieszkancy.erase(Mieszkancy.begin() + i);
					}
					else
					{
						Mieszkancy.pop_back();
					}
					break;
				}
			}
		}
	}
}

void Mieszkanie::EksmitujMieszkancow()
{
	Mieszkancy.clear();
}

vector <Mieszkaniec> & Mieszkanie::ZwrocMieszkancy()
{
	return Mieszkancy;
}

Liczniki & Mieszkanie::ZwrocLicznik()
{
	return Licznik;
}

vector <Pomieszczenie> & Mieszkanie::ZwrocPomieszczenia()
{
	return Pomieszczenia;
}

unsigned int Mieszkanie::WyswietlMaxIloscMieszkancow()
{
	return MaxIloscMieszkancow;
}

Ten sam problem jest w pozostałych plikach. Każde pole czy obiekt innej klasy ma taki bądź podobny błąd.

//edit. Program gdy był jeszcze w plikach *.h działał dobrze. Jedyna dokonana przeze mnie zmiana polegała jedynie na podziale każdego pliku *.h na *.h i *.cpp.

1

Tak jak myślałem, błąd jest tu:

#ifndef Header_h
#define Header_h

Każdy header musi mieć SWÓJ WŁASNY strażnik nagłówka. Nie kopiuj bezmyślnie kodu tylko pisz go z głową. Jak wszędzie walniesz taki sam define to kompilator załaduje ci tylko pierwszy nagłówek ;]

0

Chyba nie do końca rozumiem. Każdy z plików w projekcie ma zaincludowany ten sam plik "Header.h", którego treść zamieściłem w pierwszym poście. Coś takiego jest nieodpowiednie?

2

W każdym pliku .h inaczej powinieneś nazywać makro strażnika. Czyli w pliku o nazwie kupa.h robisz na przykład:

#ifndef kupa_h
#define kupa_h
0

Ogromnie dziękuję za pomoc. Wszystko już działa :)

0

Albo stosuj #pragma once, tyle że musisz mieć w miarę nowy kompilator :D Wtedy nie ma #ifndef cos #define cos #endif

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