webForumDet fria alternativet

Vad ska innehålla vad?

C/C++

32 svar · 836 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Har lite svårt att veta var vissa delar av koden ska ligga.
T ex vad ska finnas i .h filerna och vad ska finnas i .cpp? Är det .h filerna jag ska inkludera och ska jag inkludera .cpp filerna i .h filerna, och ska jag inkuldera dem i main.cpp eller main.h?

Om jag t ex har det globala objektet g_time som man måste komma åt från alla delar i programmet, vart ska jag deklarera den då? Innan jag inkluderar några andra filer eller har skrivit någon kod alls? Men om g_time också är beroende av objektet g_window (som också behöver komma åt g_time)... hur gör jag då?

Blir ständigt förvirrad och lyckas alltid hamna i sådana problem :( :( :(

Medlem sedan maj 20021 466 inlägg
#2

.h = deklarationsfil, tala om vad som finns
.cpp = definitionsfil, beskriv vad som finns

g_time ska deklareras i en deklarationsfil(.h) och definieras i en definitionsfil(.cpp). Deklarationsfilen kan du sedan inkludera där du behöver den. Definitionsfilen ska du aldrig inkludera.

Har du korsvis användning kan du lösa det så här:

class g_window; // Tala om att det finns en klass som heter g_window
class g_time { g_window *a;};
class g_window { g_time *b; };

Jag tycker dock att man ska försöka undvika detta.

Medlem sedan mars 20034 471 inlägg
#3

I en .h fil ligger alltså deklarationer till funktioner, klassdefinitioner samt definitionen av alla inline funktioner. (Eftersom dom inte kan göras som inline om man inte har koden tillgänglig.)

I en .cpp fil ligger alla övriga definitioner.

Exempel: Två stora klasser Person och Troll, en stor fil game som använder både Person och Troll. Vi har sex filer totalt: Person.h, Person.cpp, Troll.h, Troll.cpp, game.h och game.cpp.

  • Person.cpp inkluderar Person.h
  • Troll.cpp inkluderar Troll.h
  • game.h inkluderar Person.h och Troll.h - eftersom definitionerna av Troll och Person behövs för att game använder dessa typer.
  • game.cpp inkluderar game.h
Medlem sedan maj 20002 993 inlägg
#4

Varför får jag då dessa fel?

C:\Documents and Settings\Daniel\My Documents\Projekt\CPP\BounceUltimate4>bcc32
-tW OpenGL32.lib Glu32.lib main.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external 'WinMain' referenced from C:\PROGRAM FILES\BORLAND\BC
C55\LIB\C0W32.OBJ
Error: Unresolved external 'CDebugLog::CDebugLog(char *)' referenced from C:\DOC
UMENTS AND SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ
Error: Unresolved external 'CSpaceShip::CSpaceShip()' referenced from C:\DOCUMEN
TS AND SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ
Error: Unresolved external 'CAsteroid::CAsteroid()' referenced from C:\DOCUMENTS
AND SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ
Error: Unresolved external 'CDebugLog::~CDebugLog()' referenced from C:\DOCUMENT
S AND SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ
Error: Unresolved external 'CSpaceShip::Draw()' referenced from C:\DOCUMENTS AND
SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ
Error: Unresolved external 'CSpaceShip::Update(float)' referenced from C:\DOCUME
NTS AND SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ
Error: Unresolved external 'CAsteroid::Draw()' referenced from C:\DOCUMENTS AND
SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ
Error: Unresolved external 'CAsteroid::Update(float)' referenced from C:\DOCUMEN
TS AND SETTINGS\DANIEL\MY DOCUMENTS\PROJEKT\CPP\BOUNCEULTIMATE4\MAIN.OBJ

C:\Documents and Settings\Daniel\My Documents\Projekt\CPP\BounceUltimate4>pause
Press any key to continue . . .

Medlem sedan juni 20014 290 inlägg
#5

Nyckeln i felmeddelandet är:

Error: Unresolved external 'WinMain' referenced from

Huvud funktionen i ett konsolbaserat program heter main()
Huvud funktionen i ett windows program heter WinMain()

Du har satt projekttypen till att du vill bygga ett Windows program men du har inte någon WinMain() funktion i ditt program.
Ändra projekttypen till "konsolprogram", har inte Borland så jag vet inte exakt vad det heter.

Medlem sedan maj 20002 993 inlägg
#6

Nej jag kompilerar som ett windows program och jag har en WinMain funktion. Fick inte meddelandet innan jag ändrade plats för #include. Använde #include "fil.cpp" flrut i alla .h filer :OO

Medlem sedan mars 20034 471 inlägg
#7

Vad jag kommer att tänka på:

  1. C++ skiljer på små och stora bokstäver. Kolla att funktionen heter exakt "WinMain".

  2. Funktionen måste deklareras i någon .h fil.

Medlem sedan maj 20002 993 inlägg
#8

Förstår inte riktigt hur detta fungerar... Varför ska .cpp filen inkludera .h filen? Och hur hittas .cpp filen när den inte inkluderas i .h filen och .h filen är det enda man inkluderar i huuvdprogrammet?

Medlem sedan maj 20002 993 inlägg
#9

Det konstiga är att jag inte har ändrat koden alls i de filer där WinMain ligger som jag har laddat ner från nehe.gamedev.net... Fick bara massa konstiga fel när jag ändrade plats på include filerna... Inkluderade de filerna från main.cpp förut men ändrade plats till main.h :l

Medlem sedan juni 200010 432 inlägg
#10

Alpha II skrev:

Förstår inte riktigt hur detta fungerar... Varför ska .cpp filen inkludera .h filen? Och hur hittas .cpp filen när den inte inkluderas i .h filen och .h filen är det enda man inkluderar i huuvdprogrammet?

Headern är till för deklarationer om vad som finns. Det som står där kopieras in av kompilatorn först i filen precis som när du själv deklarerar funktioner i samma fil som main och väljer att lägga definitiorna till dessa sist i koden.
Du ska inte deklarera cpp-filer med #include, utan bara h-filer, så ja svaret på frågan är att det enda du inkluderar i huvudprogrammet är h-filerna till den funktionalitet du byggt med andra cpp filer.

Fick bara massa konstiga fel när jag ändrade plats på include filerna...

Kan bero på hur de är skrivna, den ena filen kanske är beroende av något som en annan fil deklarerat och då behöver den sistnämnda hamna före den första... exempelvis.

Medlem sedan maj 20002 993 inlägg
#11

Felet med WinMain förstår jag inte. Det hade inget med att jag ändrade include. WinMain funktionen ligger i NeheGL.cpp och jag inkluderar NeheGL.h... Varför hittas den inte av kompilatorn?

Medlem sedan juni 200010 432 inlägg
#12

Det är NeheGL.cpp du ska kompilera. NeheGL.h klistrar kompilatorn in i början av koden i NeheGL.cpp om du inkluderat den i NeheGL.cpp med
#include "NeheGL.h"

Medlem sedan maj 20002 993 inlägg
#13

Hmm... så då ska jag inkludera game.h från NeheGl.h?

Medlem sedan maj 20002 993 inlägg
#14

Är inte så säker på detta efetrsom det fanns ett exempel med där NeheGl.h inkluderades i main.cpp :l

Medlem sedan juni 200010 432 inlägg
#15

Alpha II skrev:

WinMain funktionen ligger i NeheGL.cpp

Jag svarade:

Det är NeheGL.cpp du ska kompilera.

Du skrev sen:

Alpha II skrev:

Är inte så säker på detta efetrsom det fanns ett exempel med där NeheGl.h inkluderades i main.cpp

Vad är det som är oklart? Vare sig det är main eller WinMain så får det bara finnas ett av dem och det är den filen som är din huvudfil.

Om jag exempelvis har 2 st filer som jag vill använda i en main-fil gör jag så här:

fil1.h:

#ifndef __FIL1_H
#define __FIL1_H

#define aloha 0

void minFil1funk();

#endif

Fil1.cpp

#include "Fil1.h"

void minFilfunk()
{
 ...
}

Lika med fil2.
I mainfilen:

#include "fil1.h"
#include "fil2.h"

int main()
{
  bla bla bla

  minFilfunk();  //från fil1

  return 0;
}

Om man sen satt in andra beroenden som att fil2 använder saker ur fil1 så kan man skriva #include "fil1.h" i fil2.cpp för att komma åt de konstanterna eller vad det nu är (som aloha, i mitt exempel) och då kan man ge tusan i att inkludera fil1.h i mainfilen, även om det inte gör nåt. Fil1.cpp ska aldrig inkluderas. Men däremot, så kan din utvecklingsmiljö vilja att du anger alla filer som ska ingå. Detta göres i miljön och inte i filerna.

Medlem sedan maj 20002 993 inlägg
#16

Jag klarar oftast av att programmera i c++ så länge all kod ligger i en fil. Men när jag splittrar upp all kod till ton av olika filer blir det .. förvirring :OO

T ex nu. Har en fil som kompilerar bra men från den filen (bounce.cpp) vill jag anropa en funktion i en annan fil (main.cpp). Jag har gjort följande:
*Inkluderat main.h i bounce.h
*Definierat funktionen i main.h
*Funktionen finns main.cpp

Problem: unresolved external

Skulle jag lägga all kod i bounce.cpp skulle allt vara skitenkelt. dock är det inte precis skoj med att ha allt i en fil och inte hitta något... Men hur löser jag detta problem och vad beror det på?

Medlem sedan maj 20002 993 inlägg
#17

Nu blir jag galen! Ni säger att jag inte måste inkludera .cpp filen från .h filen och att jag ska bara inkludera .h filer! Hur kommer det sig då att min kompilator vägrar bry sig om .cpp filerna när jag inkluderar endast .h filer!!! :x

Medlem sedan juni 200010 432 inlägg
#18

Grundregel:

Det som du vill ska vara synligt från *.cpp filen i andra filer som inkluderar *.h filen, MÅSTE deklareras i *.h filen. Troligen är det en sådan sak som strular för dig.
Ex:
fil1.h:

#ifndef _FIL1_H
#define _FIL1_H

void foo();

#endif

Fil1.cpp:

#include "fil1.h"

#define dummy 1

void foo(){
   if(!dummy)
      giveWizdom();
}

I main:

#include "fil1.h"

int main(){
 
 if(dummy)
    foo();
 return 0;
}

Ovan exempel genererar ett error i main då den inte har en susning om vad "dummy" är, eftersom den är deklarerad i cpp-filen. Om deklarationen av dummy flyttas till fil1.h blir den istället global och synlig för alla filer som inkluderar fil1.h.
Men man bör dock undvika att göra saker globala om man inte är säker på hur det används...

Medlem sedan juni 200010 432 inlägg
#19

Eftersom det tydligen är färdig kod du pular med kan det vara ett hästjobb att försöka bena ut detta. Men om man betraktar varje h-fil som ett "interface" mot funktionalitet i cpp-filen kanske det blir lättare att ta till sig hur man bör bygga upp sånt här i framtiden. :)

Medlem sedan maj 20002 993 inlägg
#20

Nej det är ingen färdig kod. Skrev just den (lite cut n' paste ;) ). Bara en liten enkel kod som skapar ett fönster. Sen försökte jag från den koden anropa en funktion i en annan kod fil. Och där uppstod problemet. Verkar som om kompilatorn struntar i .cpp filerna

276 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)