Toon posts:

[C++] GUI koppelen aan Model gaat fout

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben met een app. bezig, en heb een gui gemaakt, en een model, en deze wil ik koppelen volgens MVC. Ik ben bekend met hoe dit gaat, en nu ik het wil koppelen heb ik dus een dir met GUI files, en een dir met MODEL files.

Welnu, los compilen ze beide (Ze zijn onafhankelijk van elkaar ontwikkeld), maar als we ze samenvoegen (dus dat de knoppen op de gui functies uit het model aanroepen etc.) gaat het fout; het compilet niet. En de fout is erg vreemd: hij zegt dat in het model een klasse niet bekend is, maar deze kent hij, bij los compilen, wel.

Alle includes staan goed, iig, denken we , want hier is veelvuldig op gechecked.

Heeft iemand hier richtlijnen/ideeen waar het aan kan liggen? Als het nodig is kan ik wel wat code pasten, maar het is erg veel.. dus dan moet ik er wat uit strippen. Waar moet je met dit soort dingen op letten?

  • cenix
  • Registratie: September 2001
  • Laatst online: 19-04 15:39
Heb je de files in dezelfde namespace staan?
Zo nee, voeg deze namespace dan toe.

Je kunt de files wel hebben gereferenced, maar je zult ze ook moeten aanspreken via de namespace.

[ Voor 39% gewijzigd door cenix op 28-12-2005 19:25 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Namespaces zijn heel andere dingen in C++. In principe kun je model en view rustig in twee namespaces zetten. Het heeft niets met files te maken.

Bij de integratie moet je op twee dingen letten: Ten eerste moeten je dependencies niet cyclisch zijn (gui gebruikt model, niet vice versa) en ten tweede moet je in je je gui app het include path van je model lib opnemen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • cenix
  • Registratie: September 2001
  • Laatst online: 19-04 15:39
8)7 Ik denk dat ik iets teveel met C# bezig ben geweest de laatste tijd. Ik heb echt liggen slapen, aangezien het hier om C++ gaat en niet om C#.

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
MSalters schreef op woensdag 28 december 2005 @ 20:42:
Namespaces zijn heel andere dingen in C++. In principe kun je model en view rustig in twee namespaces zetten. Het heeft niets met files te maken.

Bij de integratie moet je op twee dingen letten: Ten eerste moeten je dependencies niet cyclisch zijn (gui gebruikt model, niet vice versa) en ten tweede moet je in je je gui app het include path van je model lib opnemen.
Ik werk samen met martun aan deze code, dus vandaar dat ik er ook op kan replyen :)

De GUI gebruikt alleen het model, dus dat zou goed moeten gaan. Ook staan de files van het model in het include path. Hij vindt ze ook, dus dat lijkt me ook niet fout te gaan.

Verder is het zo dat het model los wel compileert, maar wanneer het bij de gui komt gaat het fout. Maar de foutmeldingen zijn wel allemaal intern in het model....

Allemaal dus een beetje vaag, maar iig alvast bedankt voor jullie input. Als iemand nog meer ideeën heeft zijn deze natuurlijk altijd welkom :)

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 11:39
Een andere mogelijkheid kan bvb zijn dat je 2 headers hebt die op eenzelfde identifier
testen als conditie.

dus bvb een header uit je model en een header uit je gui die

#ifndef blabla
#define blabla

class ...

#endif

gebruiken.

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
schoene schreef op donderdag 29 december 2005 @ 08:54:
Een andere mogelijkheid kan bvb zijn dat je 2 headers hebt die op eenzelfde identifier
testen als conditie.

dus bvb een header uit je model en een header uit je gui die

#ifndef blabla
#define blabla

class ...

#endif

gebruiken.
Nee dat is het ook niet. Dat probleem gaan we ook uit de weg door de bestandsnamen voor die identifiers te gebruiken, en vanzelfsprekend niet meerdere bestanden met dezelfde naam aan te maken :) Kan alleen niet zeggen dat dat bewust voor dit probleem is gedaan :D

Toch bedankt voor je reactie. Toevallig iemand nog meer ideeën?

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Kun je eens de exacte foutmelding posten?
Misschien kunnen we dan iets beter helpen :)

Ducati: making mechanics out of riders since 1946


  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Het heeft even geduurd, vanwege de feestdagen. Maar hier komt de foutmelding dan toch:

[C++ Error] Port.h(83): E2303 Type name expected
[C++ Error] Port.h(83): E2139 Declaration missing ;
[C++ Error] Port.h(89): E2293 ) expected
[C++ Error] Port.h(147): E2303 Type name expected
[C++ Error] Port.h(147): E2238 Multiple declaration for 'Port::Process'
[C++ Error] Port.h(83): E2344 Earlier declaration of 'Port::Process'
[C++ Error] Port.h(147): E2139 Declaration missing ;
[C++ Error] VERTEX.H(58): E2293 ) expected
[C++ Error] VERTEX.H(62): E2303 Type name expected
[C++ Error] VERTEX.H(62): E2139 Declaration missing ;
[C++ Error] VERTEX.H(96): E2303 Type name expected
[C++ Error] VERTEX.H(96): E2238 Multiple declaration for 'Vertex::Process'
[C++ Error] VERTEX.H(62): E2344 Earlier declaration of 'Vertex::Process'
[C++ Error] VERTEX.H(96): E2139 Declaration missing ;
[C++ Error] Process.cpp(268): E2316 'setProcess' is not a member of 'InputPort'
[C++ Error] Process.cpp(268): E2188 Expression syntax
[C++ Error] Process.cpp(275): E2316 'setProcess' is not a member of 'OutputPort'
[C++ Error] Process.cpp(275): E2188 Expression syntax

Het komt er dus op neer dat Process niet herkend wordt. Hierover zeurt de compiler binnen de klassen Port en Vertex.

En Process zelf wil niet compileren omdat de compiler zeurt over de methodes setProcess() binnen de klassen InputPort en OutputPort. Deze klassen erven beide van de klasse Port.

Ik weet niet of iemand met deze foutmelding meer kan? We kunnen evt wel de gehele code posten, maar dat is wel heel erg veel...

  • staefke
  • Registratie: December 2003
  • Laatst online: 18-02 08:01
denk dat je ff moet checken welke .cpp file die port.h include (dus de cpp file waar de foutmelding vandaan komt); in port.h wordt kennelijk een type gebruikt dat door port.h zelf niet geinclude wordt en dus onbekend is; dit gaat waarschijnlijk in je losse projectjes goed, omdat daar de cpp files de benodigde header file include voordat de port.h geinclude wordt.

[ Voor 8% gewijzigd door staefke op 04-01-2006 15:07 ]

duh ?


  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Port.h, InputPort.h en OutputPort.h worden alledrie in Process gebruikt.
Process.h wordt ook in Port.h gebruikt. De klassen kennen elkaar dus.
Ze worden ook overal geinclude.
Met het compileren komt hij ook gewoon door de verschillende Port klassen heen, maar wanneer hij aan de Process klasse begint, gaat het fout. Daar onderbreekt hij het compileren dan. Dan gaat hij zeuren dat hij Process niet kent, en in Process zelf zegt hij dat hij twee methodes uit de klasse Port niet kent.

Nu snap ik alleen niet echt waar ik dan volgens jou nog naar moet kijken... Of kan het ook zijn dat ik teveel include? Ik maak echter wel gebruik van de #ifndef bij alle include files...

Of is het zo dat we ook alle bestanden van het model in de GUI zelf nog een keer moeten includen?

  • staefke
  • Registratie: December 2003
  • Laatst online: 18-02 08:01
anders toch maar de source code posten :)

[ Voor 14% gewijzigd door staefke op 04-01-2006 16:42 ]

duh ?


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Inderdaad even de relevante code posten.
Het zit er mijn inziens naar uit dat er in Port.hpp gebruik wordt gemaakt van een type dat in een andere hpp bestand wordt gedefinieerd. Maar Port.hpp heeft geen weet van die header file.

Ducati: making mechanics out of riders since 1946


  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Ok, ik heb de source code ingepakt in een rar bestand. Het is een Borland CBuilder 5 project.

Alle bestanden van de GUI staan in de bovenste map, de bestanden van het model staan in de submap 'model'.

Los van elkaar compileren ze wel, maar zo bij elkaar in hetzelfde project niet...

http://www.xs4all.nl/~jgerrits/werkversie.rar

Voor eenieder die er naar kijkt, alvast bedankt voor je hulp 8)

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 11:39
ResD schreef op woensdag 04 januari 2006 @ 16:00:
Port.h, InputPort.h en OutputPort.h worden alledrie in Process gebruikt.
Process.h wordt ook in Port.h gebruikt.
dus in process.h: #include port.h
en in port.h: #include process.h

vb: je compileert port.cpp:
1) er staat een include van port.h
2) in port.h wordt __port_h__ of zo gedefinieerd omdat die nog niet gedefineerd is, en wordt de code tussen de #ifndef en #endif bekeken
3) in port.h staat #include process.h
4) in process.h wordt __process_h__ of zo gedefinieerd omdat die nog niet gedefineerd is, en wordt de code tussen de #define en #endif bekeken
5) nu staat er weer een #include port.h, en wordt port.h opnieuw bekeken. Maar aangezien __port_h__ reeds gedefinieerd is, wordt alles tussen #ifndef __port_h__ en #endif genegeerd. Merk op dat dus de class Port nog steeds niet gekend is.
6) in de header van process.h wordt de class Port gebruikt terwijl die nog niet gekend is
==> error


oplossing:
1) ben je zeker dat de header "port.h" de class Process nodig heeft en omgekeerd? Indien bvb de class Port de class Process niet nodig heeft, de #include "process.h" weghalen uit port.h
2)Indien ze elkaar wel nodig hebben vervang je in bvb port.h #include "process.h" door
code:
1
class Process;
en includeer je process.h in port.cpp

amai, ik ben slecht in uitleggen :(

edit: ik zie nu dat je source code gepost hebt, ben weer te traag :)

[ Voor 4% gewijzigd door schoene op 04-01-2006 16:49 ]


  • staefke
  • Registratie: December 2003
  • Laatst online: 18-02 08:01
nou heb ik hier natuurlijk geen c++builder :), maar welk .cpp bestand is ie aan het compileren als die eerste foutmelding gegenereerd wordt ? maakt het zoeken wat makkelijker....

duh ?


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 11:39
ik heb hier wel c++builder en alles ik kan het project zonder probleem maken :?

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
staefke schreef op woensdag 04 januari 2006 @ 16:54:
nou heb ik hier natuurlijk geen c++builder :), maar welk .cpp bestand is ie aan het compileren als die eerste foutmelding gegenereerd wordt ? maakt het zoeken wat makkelijker....
Het gaat pas fout als hij Process.cpp gaat compileren.

@Schoene:
Welke versie van de C++ Builder heb je dan? Wij maken gebruik van versie 5, omdat die op de universiteit geinstalleerd staat. En als je projecten van versie 6 in versie 5 probeerd te laden, gaat er een heleboel mis.
Clean install hebben we ook allemaal thuis al geprobeerd, en toch blijven we alle 3 dezelfde fout krijgen...

Ik zal je uitleg met die stappen dalijk ff goed doorlezen, en ff nakijken in de source code. Dan laat ik later vanavond wel ff horen of dat nog een verschil heeft gemaakt.

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 11:39
C++Builder 6. Maar dat zou geen verschil mogen maken.

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
schoene schreef op woensdag 04 januari 2006 @ 21:07:
C++Builder 6. Maar dat zou geen verschil mogen maken.
Eigenlijk niet nee, maar we hebben aan het begin van het project al ondervonden dat het toch zo was :(

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18-04 23:33
Als ik zo de structuur van je includes bekijk zit er niet veel structuur in :) (En als daar geen structuur in zit, heb je ook kans dat je ontwerp niet klopt )

Ik vermoed echter ook dat C++ builder een systeemheader process.h heeft, dat kan problemen veroorzaken. ( Afhankelijk van path/include instellingen en weet ik wat )

Bovendien zou ik je willen aanraden om niet in een header de complete std namespace open te gooien.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
farlane schreef op donderdag 05 januari 2006 @ 08:43:
Als ik zo de structuur van je includes bekijk zit er niet veel structuur in :) (En als daar geen structuur in zit, heb je ook kans dat je ontwerp niet klopt )

Ik vermoed echter ook dat C++ builder een systeemheader process.h heeft, dat kan problemen veroorzaken. ( Afhankelijk van path/include instellingen en weet ik wat )

Bovendien zou ik je willen aanraden om niet in een header de complete std namespace open te gooien.
Ja, voordat we aan dit project begonnen konden we geen van allen C++. Het was dus ook de bedoeling om het gaandeweg te leren. Zodoende kunnen er weleens rare dingen in zitten :)

Ik zal eens kijken of het beter gaat als ik Process een andere naam geef.

En over de namespace std, waar kan die dan beter gezet worden? In het begin van de cpp file, of gewoon alle aanroepen doen met bijvoorbeeld std::cout?

Iig alweer bedankt :)

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Jajaja het probleem is opgelost! Het heeft even geduurd, maar de aanhouder wint :P

De oplossing kwam van Farlane. Ik heb in het model de klasse Process gerenamed naar Proc, en daarna de koppeling uitgevoerd. Deze werkte nu perfect :)

In iedergeval allemaal hartstikke bedankt voor de moeite, we zijn hier heel erg blij nu 8) 8)

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

ResD schreef op donderdag 05 januari 2006 @ 13:30:
[...]


Ja, voordat we aan dit project begonnen konden we geen van allen C++. Het was dus ook de bedoeling om het gaandeweg te leren. Zodoende kunnen er weleens rare dingen in zitten :)

Ik zal eens kijken of het beter gaat als ik Process een andere naam geef.

En over de namespace std, waar kan die dan beter gezet worden? In het begin van de cpp file, of gewoon alle aanroepen doen met bijvoorbeeld std::cout?

Iig alweer bedankt :)
Er zijn verschillende mogelijkheden.
using namespace std; in de cpp file zetten is er een van.
Als je bijvoorbeeld alleen std::cout gebruikt kan je het ook zo doen:
using std::cout;

Ducati: making mechanics out of riders since 1946


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 11:39
ResD schreef op donderdag 05 januari 2006 @ 13:30:

En over de namespace std, waar kan die dan beter gezet worden? In het begin van de cpp file, of gewoon alle aanroepen doen met bijvoorbeeld std::cout?
als je al using namespace std; wil gebruiken, dan zeker in de cpp-file, maar probeer dit toch te vermijden. Als je bvb heel veel std::cout gebruikt, en het niet ziet zitten om dit constant voluit te typen,
kan je ook using std::cout; gebruiken.

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Ok, dan zal ik dat ook nog ff aanpassen :)

Maar wat is eigenlijk de reden dat je het niet in de header moet zetten? Nu ik ff op google gezocht heb, zag ik wel dat het overal aangeraden wordt om het niet in een header te zetten, maar waarom stond er niet echt bij.

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Omdat je zo nog meer problemen kan krijgen met name-clashes, zo als je eerdere Process klasse. :)
Zie: http://www.parashift.com/...g-standards.html#faq-27.5
Trouwens een goede tip is om deze FAQ helemaal te lezen, zeker als je nog niet zoveel ervaring hebt met C++

Ducati: making mechanics out of riders since 1946


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 11:39
voorbeeld:

DevExpress (bedrijf die oa componenten maakt voor Delphi en BCB) had er niet beter op gevonden dan bij een update van een component in een header
code:
1
using namespace Math;

toe te voegen.

Nu moet je weten dat er een functie Round (zonder namespace) bestaat, én een functie Math::Round. Overal waar die devexpressheader geincludeerd wordt, en de gewone functie Round werd gebruikt, krijg je nu compilerfouten, omdat de compiler niet meer weet welke functie ie moet gebruiken: Round of Math::Round.

  • ResD
  • Registratie: Mei 2005
  • Laatst online: 10-12-2021
Ah ok, nu snap ik het helemaal. Thx. Ik zal gelijk ff die hele FAQ doorlezen, kan natuurlijk nooit geen kwaad :)
Pagina: 1