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.
Pokaż fragment kodu który generuje błąd.
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.
ProcEndServiceTimeEvent.h
#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
#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
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
#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()
{
}
Nie dołączasz nagłówka Processor.h
Dzięki. Zniknął ten błąd. Zostały inne. Może uda mi się z nimi poradzić.
Simulator.h
#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
#include "Simulator.h"
Simulator::Simulator()
{
}
Simulator::~Simulator()
{
}
CompareEvents.h
#pragma once
class CompareEvents
{
CompareEvents();
bool operator()(const TimeEvent *te1, const TimeEvent *te2);
~CompareEvents();
};
CompareEvents.cpp
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
#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
#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.
Wszędzie gdzie wołasz TimeEvent::execute
musisz widzieć definicję CompareEvents