Programmera spel i C++ för nybörjare/C++ headerfiler och cpp filer


Det finns bättre böcker som beskriver hur man länkar in filer i projekt. Detta dokument är bara en enkel lathund för hur man gör i korthet. Det förutsätter användning av Visual C++ 2010 express.

Istället för att skriva all kod i ett enda dokument kan du ta för vana att skriva funktionerna i ett dokument och funktionsdeklarationerna i ett annat. Största fördelen med det är att du kan återanvända funktionerna i andra projekt utan att behöva skriva om dem.

Skapa ett helt nytt projekt i konsollfönstret som heter linktest:

Radera all kod i linktest.cpp där main finns, istället skriver du:

//linktest.cpp
#include "stdafx.h"
#include <iostream> 
#include "add.h" // Detta läser in  deklarationen för add() 
  
int main() 
{
using namespace std;     
cout << "Summan av 3 och 4 = " << add(3, 4) << endl;     
return 0; 
}


Lägg till headerfil

redigera

Titta på ”Solution Explorer” längs vänsterkanten. Högerklicka på rubriken [Header Files]. Välj [Add] sedan [New Item]. I fönstret som kommer upp väljer du [Header File]. Döp den till add.h och spara alltihop. Klicka på add.h i ”Solution Explorer” och du får fram ett helt tomt kodfönster. I det skriver du: //linktest.h

#ifndef ADD_H //Unikt ord. Ser till så att den bara laddas en gång
#define ADD_H   
int add(int x, int y); // funktionsprototyp för add.h   
#endif

Lägg till Sourcefil

redigera

Titta på ”Solution Explorer” längs vänsterkanten. Högerklicka på rubriken [Source Files]. Välj [Add] sedan [New Item]. I fönstret som kommer upp väljer du [C++ File (.cpp)]. Döp den till add.cpp och spara alltihop. Klicka på add.cpp i ”Solution Explorer” och du får fram ett helt tomt kodfönster. I det skriver du:

//linktest.cpp
#include "stdafx.h"
#include "add.h"
int add(int x, int y) 
{     
return x + y; 
}

Vad händer?

redigera
  • I ditt huvudprogram länkar du in informationen om funktionen add med
#include "add.h"

precis som du skulle ha gjort om du angivit funktionsdeklarationen i main om du enbart använt en enda kodsida för alltihop.

  • I add.h har du ett unikt ord, som standard filnamnet men med ett underscore istället för punkt, detta för att förhindra att filen blir inläst flera gånger av olika funktioner. En gång räcker. Där står funktionsdeklarationen, på samma sätt som du skulle ha lagt in den innan main i ett vanligt program med en enda kodsida.
  • I add.cpp finns själva funktionen, precis på samma sätt som du skulle ha lagt in den efter main i ett vanligt program med en enda kodsida. Vi anropar add.h från add.cpp för att ha en koppling mellan funktionsdeklarationen och funktionsbeskrivningen.

(Källa: http://www.learncpp.com/cpp-tutorial/19-header-files/ )

Med klasser

redigera

Naturligtvis kan man göra likadant med klassers deklarationer och definitioner.

Byt ut koden i linktest.cpp till:

#include "stdafx.h"
#include <iostream> 
#include "add.h" // Detta läser in  deklarationen för add() 
using namespace std;

int main()
{
    student bob;
    cout <<bob.id;
    return 0;
}

Byt ut koden i add.h till:

#ifndef INCLUDED_S_H
#define INCLUDED_S_H

class student
{
 public:
   int id;
   student();
};

#endif

Byt slutligen ut koden i add.cpp till:

#include "stdafx.h"
#include "add.h"
student::student()
{
   id = 1;
}

Vad händer?

redigera
  • I add.h har vi själva beskrivningen av klassen
  • I add.cpp finns beskrivningen av de funktioner som klassen använder sig av.
  • I huvudprogrammet skapas en ny instans av klassen student som döps till bob, därefter anropas funktionen från add.cpp.

(Källa: http://www.tek-tips.com/viewthread.cfm?qid=1310604 )

Utan VC++ filer

redigera

Om du vill kompilera utan förkompilerade filer som är anpassade enbart för visual c++ höger klickar du på projektets namn i "Solution Explorer" och välj "Properties" längst ner. Välj sedan:

[C/C++]
  [Precompiled Headers]

På översta raden i högra fönstret med rubriken [Precompiled Headers] ändrar du värdet från Use (Y/u) till Not Using Precompiled Headers.

Därefter kan du plocka bort samtliga:

#include "stdafx.h"

i dina programfiler, samtliga fel kopplade till include-satsen bör också försvinna.


Att komma åt klasser i headerfiler

redigera

Det är en sak att skicka in variabler mellan header och sourcefiler. En helt annan sak om du skall hantera klasser och klassinstanser mellan olika filer. Här är ett exempel på hur du kan göra om en klass skall användas som parameter i en funktion som ligger i en separat fil:

Skapa först en headerfil. I det här exemplet kan du kalla den student.h Detta för att den här förklaringen skall fungera med kapitlet om hur man använder klasser i funktioner (så att jag slipper skriva samma sak på olika ställen :)

#ifndef student_H //Unikt ord. Ser till så att den bara laddas en gång
#define student_H 
//OBS klasser som används i funktioner måste definieras här
//istället för i main.  
class student
{
public:
char name[20];
int num;
float score[3];
};

//Funktionen som använder klassen måste finnas efter class-deklarationen
 void print(class student &p); // funktionsprototyp för att skriva ut klassens värden  
#endif

Lägg därefter till en .cpp fil som du döper till student.cpp

//student.cpp
#include "stdafx.h"
#include "student.h" //Koppling måste finnas
#include <iostream> //Annars fungerar inte std::

void print(class student &p)
{
 std::cout<<p.num<<std::endl;
 std::cout<<p.name<<std::endl;
 std::cout<<p.score[0]<<std::endl;
 std::cout<<p.score[1]<<std::endl;
 std::cout<<p.score[2]<<std::endl;
 std::cout<<" "<<std::endl;
}


Slutligen, i main fyller du i:

#include "stdafx.h"
#include <iostream> 
#include "student.h" // Detta läser in  funktionerna

int main() 
{
//using namespace std;     
   
setlocale(LC_ALL, "swedish"); //svenska tecken vid cout

class student stu; //Skapa en klassinstans som döps till stu
stu.num=12345; //ge stu ett nummer
strcpy_s(stu.name,"Jöns-Åke"); //Ge stu ett namn
stu.score[0]=67.5f;
stu.score[1]=89;
stu.score[2]=78.6f;

//Kör funktionen i student.cpp
print(stu); 

return 0; 
}