[C++ , MFC] Vector in header declareren

Pagina: 1
Acties:

  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 23:36

Beyond

Dussssss.......

Topicstarter
Ik wil graag een vector in mijn .h file declareren, maar om de één of andere reden wil dat niet.

Mijn header file ziet er zo uit:
(ProjectMFC.h)
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class CMyApp : public CWinApp
{

public:
    virtual BOOL InitInstance ();

};

class CMainWindow : public CFrameWnd
{


public:    
    CMainWindow ();
    void AddToAdresVector (CAdresgegevens * adres);
    
    
private:
    //typedef vector<int> myVector;
                //typedef std::vector<int> IntVector;
    vector<CAdresgegevens> myVector;

    
protected:  
    afx_msg void OnMenuItemInfoOver();
    afx_msg void OnMenuItemBestandToevoegen();
    DECLARE_MESSAGE_MAP ()
};


In de cpp include ik het volgende:
(ProjectMFC.cpp)
C++:
1
2
3
4
5
6
7
8
#include "StdAfx.h"
#include <vector>

using namespace std;

#include "Adresgegevens.h"
#include "ProjectMFC.h"
#include "resource.h" 


De errors:
code:
1
2
3
4
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(20) : error C2143: syntax error : missing ';' before '<'
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(20) : error C2501: 'vector' : missing storage-class or type specifiers
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(20) : error C2059: syntax error : '<'
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(20) : error C2238: unexpected token(s) preceding ';'


Deze errors slaan op de regel: vector<CAdresgegevens> myVector;

PS die vector met die int ipv CAdresgegevens werkte ook niet en die andere:
typedef std::vector<int> IntVector;
geeft errors maar omdat ik using namespace std gebruik hoef ik volgens mij geen std:: ervoor te zetten.
errors:
code:
1
2
3
4
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(21) : error C2653: 'std' : is not a class or namespace name
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(21) : error C2143: syntax error : missing ';' before '<'
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(21) : error C2059: syntax error : '<'
c:\program files\microsoft visual studio\myprojects\projectmfc\projectmfc.h(21) : error C2238: unexpected token(s) preceding ';'

[ Voor 39% gewijzigd door Beyond op 28-04-2005 19:07 ]

Al het goeie.......


  • Farmerwood
  • Registratie: September 2004
  • Niet online
En als je er std:: voor zet?

std::vector<CAdresgegevens> myVector;


edit:
Hm beetje editen terwijl ik me antwoord typte..... :P

[ Voor 37% gewijzigd door Farmerwood op 28-04-2005 19:24 ]


  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 23:36

Beyond

Dussssss.......

Topicstarter
Ja, sorry. Ik blijf proberen maar het lukt niet.

Al het goeie.......


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
#include <vector> in je .h

De standaard headers mogen in andere headers. Gebruik daar wel std::vector< >, omdat using namespace niet in .h's thuishoort.

Overigens heb je voor std::istream& en std::ostream& een #include <iosfwd>, daar hoef je geen <istream> en <ostream> voor te gebruiken (laat staan <iostream>)

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


  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 23:36

Beyond

Dussssss.......

Topicstarter
thnx het werkt nu.

ik dach dat je vector ook gewoon in je cpp file mocht includen.

Include je alleen je eigen .h files in je cpp en de rest (zoals vector e.d.) in je .h file ?

Al het goeie.......


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Beyond schreef op donderdag 28 april 2005 @ 21:16:
thnx het werkt nu.

ik dach dat je vector ook gewoon in je cpp file mocht includen.

Include je alleen je eigen .h files in je cpp en de rest (zoals vector e.d.) in je .h file ?
Je moet kijken wat je in je header ( .h) nodig hebt. Als je daar een vector nodig hebt, moet je vector ook includen. ( Hier dus ook oa de header waar CAdresgegevens in staat )

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Op zich klopt de observatie van farlane, alleen is "wat je in een header nodig hebt" niet altijd hard te bepalen. Met een klein trucje kun je alle data (en daarmee alle headers) van je eigen header naar de .cpp verplaatsen. Dat geldt ook voor vector<>, maar dat is in de praktijk nauwelijks een voordeel.

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


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Beyond schreef op donderdag 28 april 2005 @ 21:16:
thnx het werkt nu.

ik dach dat je vector ook gewoon in je cpp file mocht includen.

Include je alleen je eigen .h files in je cpp en de rest (zoals vector e.d.) in je .h file ?
Je moet het eigenlijk zo zien: Door in je .cpp bovenaan je .h te includen, wordt deze door de compiler er ook gewoon letterlijk boven geplaatst. Hierdoor weet je in de .cpp ook alles wat er in de .h gedefinieerd is. Andersom is dat dus niet het geval. Alles wat in je .cpp gedefinieerd is, is niet in de .h bekend, aangezien deze bóven de .cpp komt te staan.

De .h is dus de definitie (waarin beschreven staat wat er allemaal in je class komt), en de .cpp is de uitwerking ervan.

Dit beeld kan ook verhelderend werken voor het feit dat headers elkaar niet kunnen includen. Als je in a.h een include doet van b.h, en in b.h ook een include van a.h, zal de compilere eindeloos deze dingen boven elkaar willen plaatsen.

[ Voor 7% gewijzigd door riezebosch op 29-04-2005 10:04 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Misschien is het ook verhelderend om een stukje te lezen over hoe een c++ programma wordt gecompiled/gelinked.

Voor elke 'compilatie unit' ( normaal gesproken de .cpp bestanden, dus niet de .h bestanden ) wordt apart een object file (.obj) gegenereerd.
Echter voordat een .cpp bestand functies,classes etc kan gebruiken moet de compiler daarvan het prototype kennen. Deze staan iha in de header file, vandaar dat je ze moet includen.

De object files worden daarna gelinked met elkaar door de linker, waarbij functies die de een .obj nodig heeft worden opgezocht in de andere .obj bestanden en daarbij wordt meteen de functie main opgezocht zodat je besturingssysteem weet waar hij moet beginnen met het uitvoeren van je programma.

[ Voor 3% gewijzigd door farlane op 29-04-2005 10:40 ]

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Niet in C++ hoor. Dan werken globals niet. Meestal maakt een compiler een hidden method per obj aan, die eerst aangeroepen wordt. De .cpp file main bevat zal vanuit die hidden method main aanroepen. Opruimwerk kan vervolgens weer door die hidden method gebeuren nadat main( ) een return heeft gedaan.

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


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

De .cpp file main bevat zal vanuit die hidden method main aanroepen
Dat lijkt me een flakey aanpak, hoe garandeer je dan dat main wordt aangeroepen nadat alle globals geconstruct zijn? MSVC++ doet het volgens mij gewoon op de manier die farlane beschrijft, met dan idd de toevoeging van constructor code per object file, die door de runtime worden aangeroepen voordat main wordt aangeroepen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
.oisyn schreef op vrijdag 29 april 2005 @ 13:10:
[...]
Dat lijkt me een flakey aanpak, hoe garandeer je dan dat main wordt aangeroepen nadat alle globals geconstruct zijn? MSVC++ doet het volgens mij gewoon op de manier die farlane beschrijft, met dan idd de toevoeging van constructor code per object file, die door de runtime worden aangeroepen voordat main wordt aangeroepen.
Het idee is dat die hidden methode de tabel met global ctors afloopt, die de linker heeft gemaakt. Pas daarna zal de hidden method main aanroepen.

In elk geval is main( ) dus voor het OS niet meer het entry point, maar een C++RT functie die uiteindelijk jouw main aanroept. Voor MSVC is dat mainCRTstartup (zie crt0.c)

[ Voor 13% gewijzigd door MSalters op 29-04-2005 14:42 ]

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