Projekt, nielogiczny blad - pointer to incomplete type

Projekt, nielogiczny blad - pointer to incomplete type
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0

Mam tu projekt dość duzy. Sory ze go wrzucam tutaj a nie na githuba ale skompresowałem do kilkunastu kB. Olejcie to co robi ten ten projekt. Popatrzcie sb na pierwszy błąd. Jest tam: "Pointer to incomplete type is not allowed", gdy chcę się odnieść do obiektu klasy os przez kropkę. Siedze już na tym godzinę. Nie mam pojęcia o co tam może chodzić. Byłbym naprawdę niezmiernie wdzięczny jakby komuś się udało ogarnąć o co tu chodzi z tym błędem.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Pokaż fragment kodu który generuje błąd.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
1

Nie masz pełnej definicji klasy w miejscu jej użycia. Nie chce mi się kodu ściągać i przeglądać - wrzuć na githuba czy coś.

Je​śli masz klasę, która zawiera np. unique_ptr<T> to albo musisz w każdym TU z nią widzieć pełną definicję T, albo musisz zadeklarować w niej destruktor.


MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0

ProcEndServiceTimeEvent.h

Kopiuj
#pragma once

class ProcEndServiceTimeEvent : public TimeEvent
{
public:
	ProcEndServiceTimeEvent(int occurence_time);
	void execute(OS os, priority_queue <TimeEvent *, vector <TimeEvent *>, CompareEvents> Agenda);
	~ProcEndServiceTimeEvent();
};

 

ProcEndServiceTimeEvent.cpp

Kopiuj
#include "TimeEvent.h"
#include "ProcEndServiceTimeEvent.h"
#include "OS.h"
#include <queue>
#include <vector>
#include "Process.h"

ProcEndServiceTimeEvent::ProcEndServiceTimeEvent(int occurence_time) : TimeEvent(occurence_time) {}

void ProcEndServiceTimeEvent::execute(OS os, priority_queue <TimeEvent *, vector <TimeEvent *>, CompareEvents> Agenda)
{
	//musze dostac do procesu ktory jest w procesorze i zwolnic procesor
	Process *proc = os.proc->GetProcess(); //tu blad podkresla slowo os i wywala ten blad co podalem
	os.proc->ReleaseProcessor();
	//Jeżeli TPIO != 0: Umieść proces w odpowiedniej
	if (proc->TPIO != 0) //kolejce procesów oczekujących
		os.q_wait_proc[proc->randIO]->Add(proc);
	else
	{
		cout << "Usuwam podany proces z systemu: " << *proc << endl;
		delete proc;
	}
}

ProcEndServiceTimeEvent::~ProcEndServiceTimeEvent()
{
}
 

OS.h

Kopiuj
class QueueProcWait;

class OS
{
public:
	OS(const int nio);

	std::vector <IODevice *> vec_io_device; //wektor urzadzen I/O
	Processor *proc; //procesor
	QueueProcReady *q_ready_proc; //kolejka procesow gotowych
	std::vector <QueueProcWait *> q_wait_proc;
	const int N_IO; //liczba urzadzen I/O

	~OS();
}; 

OS.cpp

Kopiuj
#include "Processor.h"
#include "QueueProcReady.h"
#include "QueueProcWait.h"
#include "IODevice.h"
#include "OS.h"

OS::OS(const int nio) :N_IO(nio)
{
	for (int i = 0; i<N_IO; i++) //tworzymy urzadzenia i/O
		vec_io_device.push_back(new IODevice);

	proc = new Processor; //tworzymy procesor

						  //tworzymy kolejke procesow gotowych (do CPU)
	q_ready_proc = new QueueProcReady();

	//tworzymy tyle
	//kolejek procesow oczekujacych ile jest urzadzen I/O
	for (int i = 0; i < N_IO; i++)
		q_wait_proc.push_back(new QueueProcWait());
}

OS::~OS()
{
}
 
edytowany 3x, ostatnio: Mikilll
kq
I gdzie jest błąd?
MI
napisalem komentarz gdzie jest. drugi plik od gory
L0
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
2

Nie dołączasz nagłówka Processor.h

MI
Bo nie muszę. Nie wykorzystuję klasy Processor tylko klase Process
L0
z tego co widzę OS::proc jest typu Processor
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0

Dzięki. Zniknął ten błąd. Zostały inne. Może uda mi się z nimi poradzić.

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0

Simulator.h

Kopiuj
#pragma once
#include <queue>
#include <vector>

class TimeEvent;
class CompareEvents;

class Simulator
{
public:
	Simulator();
	int global_time;
	std::priority_queue <TimeEvent *, std::vector <TimeEvent *>, CompareEvents> Agenda;
	~Simulator();
};
 

Simulator.cpp

Kopiuj
#include "Simulator.h"

Simulator::Simulator()
{
}


Simulator::~Simulator()
{
}

CompareEvents.h

Kopiuj
 #pragma once

class CompareEvents
{
	CompareEvents();
	bool operator()(const TimeEvent *te1, const TimeEvent *te2);
	~CompareEvents();
};

CompareEvents.cpp

Kopiuj
 CompareEvents::CompareEvents()
{
}

bool CompareEvents::operator()(const TimeEvent * te1, const TimeEvent * te2)
{
	//kolejność - rosnąco
	if (te1->occ_time > te2->occ_time) return true;
	return false;
}

CompareEvents::~CompareEvents()
{
}

TimeEvent.h

Kopiuj
 #pragma once
#include <queue>
using namespace std;

class OS;
class CompareEvents;

class TimeEvent
{
public:
	int occ_time;
	virtual void execute(OS os, priority_queue <TimeEvent *, vector <TimeEvent *>, CompareEvents> Agenda) = 0;
	TimeEvent(int occurence_time);
};

TimeEvent.cpp

Kopiuj
#include "TimeEvent.h"

TimeEvent::TimeEvent
(int occurence_time) : occ_time(occurence_time) {} 

Został mi ostatni błąd. Otóż wszystko działa jak zakomentuje wszystkie linijki w ktorych jest kolejka priorytetowa, a jezeli ich nie zakomentuje to wywala blad:
Error C2139 'CompareEvents': an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_nothrow_constructible' Symulacja_zadanie2 c:\program files (x86)\microsoft visual studio 14.0\vc\include\type_traits 701

Przy czym jak klikne 2x w ten blad to mnie wywala do jakiegos pliku spoza projektu.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
2

Wszędzie gdzie wołasz TimeEvent::execute musisz widzieć definicję CompareEvents


Zobacz pozostałe 2 komentarze
MI
Kompiluje caly projekt, a blad nie wiem gdzie jest bo jak klikne to mnie wyrzuca poza projekt.
kq
Zobacz logi kompilacji.
MI
c:\program files\codeblocks\mingw\bin..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_queue.h|382|error: 'std::priority_queue<_Tp, _Sequence, _Compare>::comp' has incomplete type| Caly projekt wrzucilem na samej gorze
kq
Log kompilacji - zobacz podczas kompilacji którego z Twoich plików wyrzuciło błąd.
MI
Już rozkminilem. Problem byl taki ze wszystkie pola klasy CompareEvents były prywatne.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.