projekt wieloplikowy, problem

0

Witam,
W pisaniu aplikacji gdzie kod jest w kilku plikach jestem laikiem, ale do tej pory udawało mi się. Teraz napotkałem na problem którego nie potrafię rozwiązać. Przesiedziałem już nad tym ze 3 godziny próbując to skompilować w Visual Studio 11 Beta i Visual Studio 10. Wydaję mi się że to IDE nie powinno mieć aż tak podstawowych błędów dlatego pewnie wina leży po mojej stronie. Oto kody:

 //Wyklad.h
#pragma once
#include <iostream>
#include <vector>
#include "Student.h"
//using namespace std;


class Wyklad{
private:
	std::string nazwa;
	int idWykladu;
	std::vector <Student> studenci;
public:
	Wyklad(std::string, int);
	~Wyklad(void);

};
//Student.h
#pragma once
#include "Wyklad.h"
#include <iostream>
#include <vector>

//using namespace std;

class Student{
private:
	std::string nazwisko;
	int idStudent;
	std::vector <Wyklad> wyklady;
public:
	Student(std::string, int);
	~Student(void);

};
 //Uczelnia.h
#pragma once
#include <iostream>
#include <vector>
#include "Student.h"

using namespace std;


class Uczelnia{
private:
	string nazwa;
	string adres;
	int telefon;
	vector <Student> studenci;
public:
	Uczelnia(string, string, int);//nazwa adres telefon
	~Uczelnia(void);
	void usunStudenta(void);
	void OdczytajDaneStudenta(void);
	void OdczytajWszystkichStudentow(void);
	void DodajWydzial(void);
	void UsunWydzial(void);
	void OdczytajWszystkieDaneWydzialu(void);
	void OdczytajWszystkieWydzialy(void);	
	void DodajStudenta(void);
};

kompilator wywala mi coś takiego

 Wyklad.cpp
1>c:\users\lukasz\documents\moje programy\inzynieria\lab5-6\lab6kod\lab6kod\student.h(13): error C2065: 'Wyklad' : undeclared identifier
1>  Uczelnia.cpp
1>c:\users\lukasz\documents\moje programy\inzynieria\lab5-6\lab6kod\lab6kod\wyklad.h(13): error C2065: 'Student' : undeclared identifier
1>  Student.cpp
1>c:\users\lukasz\documents\moje programy\inzynieria\lab5-6\lab6kod\lab6kod\wyklad.h(13): error C2065: 'Student' : undeclared identifier

Reszty plików nie wstawiałem bo nie wiem czy ma to sens, jeśli potrzeba to uzupełnię post o resztę plików. Proszę o pomoc

0

Dodaj deklaracje zapowiadające zaraz po pragmach. Podczas analizy klasy takiego studenta kompilator nie ma pojęcia o istnieniu klasy wykład.

0

Ogólnie coś raczej jest nie tak z projektem - takie zapętlone zależności wskazują, że coś z koncepcją jest prawdopodobnie nie tak.

Możesz przenieść z tych plików .h te #include "wyklad/student.h" do odpowiadającym im plików cpp, a przed definicjami tych klas dać deklaracje zapowiadające.
Przed definicją klasy Wyklad dać class Student; i analogicznie przed klasą Student

0

Dzięki, teraz jak dałem zapowiedzi klasy zaraz po pragma to działa;) Wcześniej też dawałem takie zapowiedzi tyle, że tuż przed deklaracją innej klasy. Myślałem, że to bez znaczenia w którym miejscu ją zapowiadam. A jeszcze takie pytanie trochę powiązane więc zapytam w tym wątku. Co się zmienia jeśli includy do innych bibliotek dam w ten np w ten sposób? :

//Student.h
#include <iostream>
#include <vector>

#pragma once
class Wyklad;
#include "Wyklad.h"

//using namespace std;

class Student{
private:
	std::string nazwisko;
	int idStudent;
	std::vector <Wyklad> wyklady;
public:
	Student(std::string, int);
	~Student(void);
}; 

To ma jakieś znaczenie co do późniejszego działania programu albo do jego rozmiarów?

0

Nie ma, ale lepiej pragma once dać na sam początek. Od razu ją widać i lepiej się to po prostu czyta.

Jeżeli chodzi o tą deklarację zapowiadającą to sprawa wygląda bardzo prosto. #include po prostu wrzuca całą zawartość z dołączanego pliku w miejsce wystąpienia dyrektywy.
W Twoim wypadku dzięki pragma once w zależności od tego, który plik będzie wcześniej kompilowany będziesz miał zawartość wykład.h dalej zawartość student.h, albo odwrotnie. Dlatego w jednej z tych klas druga nie była widoczna.

0

Dzięki, już teraz wszystko jasne;)

0

Jeszcze jedno. Zastanów się nad strukturą tych wektorów. Co najmniej jeden z nich musi być wektorem wskaźników, bo inaczej będziesz miał studenta, który ma tablicę wykładów, z których każdy ma tablicę studentów, gdzie każdy student ma tablicę wykładów i tak dalej. Wszyscy studenci i wszystkie wykłady byłyby zupełnie innymi zmiennymi. Pomijając nieskończony charakter takiej struktury to się po prostu nie skompiluje.

0

Nie, vector nie może przechowywać elementów jako tablica wskaźników. Choćby ze względu na metodę data, która zwraca wskaźnik do tablicy z danymi na której jest oparty i nie jest to kopia tych danych. Korzystam z tego w jednym z projektów cały czas - wektory są u mnie buforami dla komunikacji po socketach.

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