[C++] types in headers gebruiken

Pagina: 1
Acties:

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 14-11-2025

JayVee

shibby++!

Topicstarter
Hey proggerds!

Ben sinds een paar dagen bezig mijn 3d engine van Java naar C++ te porten. Moet sneller en ik wil uiteindelijk OpenGL of Direct3d gebruiken.

Maar goed, heb al drie C++ tuts doorgelezen en krijg pointers en structs en zo wel aardig onder de knie.

Nu heb ik echter een probleem met het verspreiden van je progje onder meerdere bestanden:

Je hoort in header files geen includes te zetten. Maar wat moet je dan doen als je in de declaraties types gebruikt die niet toevallig in die header worden gedeclareert? Een voorbeeld:
In core.h wil ik een functie declareren:
C:
1
2
3
4
5
struct v_3d {
  float x, y, z;
};

void vec2string( v_3d, string );
Natuurlijk gaat de compiler zeuren omdat hij string niet kent. Die include ik ook in de bijbehorende cpp file.

Hetzelfde dilemma heb ik in vemath.h, waar ik alle wiskunde functies ingepropt heb:
C:
1
2
#include "core.h"
float calcLength ( v_3d );
Hier moet hij weten wat v_3d voorstelt. Dus hebik gewoon maar core.h geinclude. Maar volgens mij hoort die include daar dus niet te staan. Maar wat moet je dan?


Heb al gesearched op het net (nergens een tutorial te vinden over hoe je dit doet, alleen over het proggen zelf...) en op GoT maar de meeste TSers hadden stomme fouten gemaakt, dat doe ik niet! >:) Ik gebruik trouwens de Borland 5.5.1 command line compiler onder WinXP.
De complete source kan je hier downloaden.


//edit:
Oh ja, als we toch bezig zijn...
Ik heb een functie die van een vector een string moet maken:
C:
1
2
3
4
5
6
7
void vec2string( v_3d u ) {
  string s;
  stringstream ss;
  ss << "{" << u.x << "-" << u.y << "-" << u.z << "}";
  ss >> s;
  cout << "DUDE! " << s << endl;;
}
Uiteindelijk moet de string dus meegestuurd worden maar dat werkt dus nog niet...
Het probleem wat ik hier heb is dat als ik spaties in een van die strings zet (dus ", " ipv "-") s dan bij die spatie ophoudt. Enig idee waarom of hoe ik dat kan veranderen?

[ Voor 17% gewijzigd door JayVee op 27-09-2003 16:05 ]

ASCII stupid question, get a stupid ANSI!


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 140% gewijzigd door Eelis op 18-02-2015 20:04 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Waar je het beste door leert hoe je die includes e.d. moet gebruiken is gewoon even de headerfiles doorkijken van de standardlibraries. Je ziet dan snel genoeg hoe je dat soort dingen aanpakt :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 14-11-2025

JayVee

shibby++!

Topicstarter
Eelis schreef op 27 september 2003 @ 16:10:
[...]

std::stringstream heeft een str() member die de inhoud in een std::string returned.
Hey, die werkt idd beter dan "ss >> s;"
Waarom als ik mag vragen?
Heb hier gelezen hoe het moet.

ASCII stupid question, get a stupid ANSI!


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 102% gewijzigd door Eelis op 18-02-2015 20:04 ]


  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 14-11-2025

JayVee

shibby++!

Topicstarter
Heb idd net beetje rondgeneusd in de library. Daar wordt ik echt niet wijs uit! Volgens mij zit drm nu hard te lachen... :+

Maar goed. Iemand een linkje naar een tutorial hoe dat werkt? Dan krijg ik zeker ook met makefiles te maken etc. Zou wel handig zijn als ik niet elke keer alles moet compilen.

ASCII stupid question, get a stupid ANSI!


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 20:04 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Eelis:
De standard library bestaat grotendeels uit templates waarvan de implementatie in de header files te vinden is. Het lijkt me voor de TS wellicht beter om eerst te leren hoe de klassieke header/implementation scheiding met gescheide compilatie werkt, dus zou ik hem niet willen aanraden met de standard library te beginnen. Daarnaast valt nog te betwijfelen of source bestuderen een goede manier van leren is ;).
mja, zit wat in :)
JayVee:
Heb idd net beetje rondgeneusd in de library. Daar wordt ik echt niet wijs uit! Volgens mij zit drm nu hard te lachen... :+
er is natuurlijk een verschil tussen even goed bestuderen en erin rondneuzen ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Types die je in een header gebruikt hoeven niet gedefineerd te zijn, maar kunnen ook alleen gedeclareed zijn mits je ze uitsluitend gebruikt als return type of om pointer/reference types mee te maken.

Zo'n declaratie is bijvoorbeeld simpelweg
code:
1
2
struct v_3d; // Declaratie
float calcLength ( v_3d const&  ); // Hoeft niet te weten hoe een v_3d in elkaar zit.


Er zijn twee redenen waarom je dit wil: Headers kunnen niet cyclisch naar elkaar verwijzen, en de compilatie tijd stijgt te hard als headers andere headers gaan includen. Omdat standard headers nooit jouw headers includen en er maar een paar standaard headers zijn werkt deze truc niet voor std::string e.d.

@drm: De standaard header files zijn zo mogelijk de allerslechtse voorbeelden, omdat ze allerlei non-portable trucs in de implementatie gebruiken. Alleen de externe interface (classes e.d) is portable. Zo mag een implementatie best #pragma's gebruiken, bijvoorbeeld #pragma once. Dat wil je niet als voorbeeld demonstreren.

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

Pagina: 1