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:prawie 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:2 dni
  • 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:około 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:2 dni
  • 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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)