rvitinn

include skrr C++

Fjlmargir hafa haft samband vi mig undanfari og grtbei um fleiri stefnulausa og illa skrifaa forritunarpistla. g get ekki anna en lti undan essum rstingi og bi sta adendur um a gefa mr n sm fri :-) Hugsanlega hjlpar a refresha suna til a f rlti lsilegri C++ kadmi, g urfti nefnilega a sa rliti stylesheet skrnni.

C++ ka er skipt upp tvr tegundir skra, include skrr sem vanalega enda .h innihalda skilgreiningar, og svo skrr sem innihalda tfrslu og enda yfirleitt .cpp.

Mrgum finnst etta galli C++ og kjsa frekar a hafa allt smu skrnni eins og t.d. java og python. g s msa kosti vi etta etta krefjist meiri vinnu. Alvru ritlar auvelda hana tluvert.

Almenna reglan er s a .h skrm eiga bara a vera skilgreiningar og ekkert anna. Stundum setja menn tfrslur fllum ar inn til a f r inline upp hraa, en g mli me v a slkt s forast svo lengi sem hgt er. Betra er a setja inline ka sr skr og include-a hana .h skrna en g tla ekki a fjalla frekar um a hr.

h skrm arf a oftast a inklda arar h skrr til a geta skilgreint klasa ea fll. Almenna reglan varandi include h skrm er a maur a taka inn jafn lti og maur kemst upp me. annig arf maur a vsa h skr fyrir tpu ef maur notar tilvik af tpunni en ekki egar maur notar bendi ea reference. stan fyrir v a forast skal arfa vsanir h skrr er a r taka mikinn tma ingu og strum forritum getur str hluti ingartmans fari include ml. Ef maur inkldar skrnni a.h b.h og breytir svo a.h arf andinn a endura b.h og allt sem stlar hana. Ef a include var arft er hugsanlega veri a a helling af ka n nokkurrar stu. Einnig er oft veri a gefa arfa upplsingar me v a hafa allt include h skrnni. Notandi einingar a lesa h skrna til a sj vimt hennar, ar eiga alls ekki a koma fram upplsingar um tfrslu ef hgt er a forast a. Aftur mti er nausynlegt a vsa allar h skrr tfrsluskrnni (cpp). Engar arar skrr eiga a stla tfrlsuskrna, annig a ekki skiptir jafn miklu mli helling s includea ar. Vissulega eykst tminn, en aukningin er lnuleg en ekki veldisleg eins og stundum egar of miklu er includea h skrm.

// sull.h
class Sull {
    public:
        Sull();
        ~Sull();
        void foo() const;
    private:
    	int foo;
};

// bull.h
// nausynlegt a inklda ar sem tilvik af Sull er nota
#include "sull.h"  class Bull {
    public:
        Bull();
        ~Bull();
        void foo() const;
    private:
    	Sull s;
};

// drull.h
// nausynlegt a inklda ar sem klasinn erfir fr Sull
#include "sull.h"  
class Drull : public Sull {
    public:
        Bull();
        ~Bull();
};

// sullumbull.h
class Sull;  
// Hr arf ekki a inklda ar sem bendir  tpuna 
// er notaur, v er ng a fyrirfram skilgreina klasann
class SullumBull {
    public:
        SullumBull();
        ~SullumBull();
        void foo() const;
    private:
    	Sull* s;
};

// sullumbull.cpp
#include "sullumbull.h"
// urfum a inklda henni  tfrsluskrnni.
#include "sull.h"		
SullumBull::SullumBull()
{
    s = new Sull;
}


stan fyrir v a er nausynlegt a inklda skrm egar veri er a nota tilvik ea erfa fr tpu er a andinn arf a vita hvernig tpan er tfr minni. Ef a er aftur mti veri a nota bendi ea reference veit andinn hversu miki plss arf ar sem bendar eru alltaf jafn strir, sama hva eir benda . a er ekki fyrr en kemur a tfrslunni sem meiri upplsinga er rf fyrir andann eim tilvikum.

Skoum dmi um hva illa grundu notkun include getur haft fr me sr.

// a.h
// vector klasinn er einungis notaur vi tfrslu essa 
//klasa en ekki  vimti, samt inklda  h skr
#include <vector> 
class A
{
    public:
        void doSomeStuff(int) const
};

// b.cpp
std::vector<int> intVector;
A::doSomeStuff(int stuff) {
    intVector.push_back(stuff)

// b.h
#include "a.h" //notum A reference en inkldum samt
class B
{
    public:
        int stuffCounter(const A&);
};

// c.h
#include "a.h" //notum B bendi en inkldum samt
class C
{
    public:
        void foo();
    private:
        B* b;
};

Ef vi einhverju stigi kveum a breyta frlsunni A annig a sta ess a nota vector tlum vi a nota map urfum vi a endura allt drasli aftur rtt fyrir a ekkert hafi breyst vimti klasanna sem vi erum a nota.

a er oft hentugt a nota fyrirfram skilgreiningar klsum sta ess a inklda skrna. Fyrirfram skilgreining er ger me v a skrifa einfaldlega class Nafn; ur en vsa er tpuna. tfrsluskrnni arf svo a nota include.

eir sem hafa lesi til enda eiga hrs skili. Ef etta er skiljanlegt ea algjrt bull, sem mig grunar, setji endilega inn athugasemd. Ef i eru sammla v sem hr er sagt, setji inn athugasemd.

17.12.03 13:30
Jn Arnar bendir rttilega a a arf a gera undantekningar egar kemur a templates. g get ekki sett kadmi athugasemdir og nenni ekki a stilla comment filterinn, annig a etta dmi tengist athugasemdinni minni hr fyrir nean. Sama gildir um inline fll sem g minnist upphafi.


// tfrsla inline
template<class T> class Plus
{
class="k">public:
    T reikna(const T& a, const T& b) const
    {
        return a+b;
    }
};

// tfrsla sr
template<class T> class Minus
{
public:
    T reikna(const T& a, const T& b) const;
};

// tfrsla, gti veri  sr skr og include-a  h skr
// ea einfaldlega near  smu h skrnni
template <class T> 
T Minus<T>::reikna(const T& a, const T& b) const
{
    return a-b;
}

c++
Athugasemdir

jonarnar - 17/12/03 11:14 #

Fyrirtaks frsla ! Mig langar samt a benda einn agna sem brtur essi skil milli .h og .cpp skra (allaveganna me g++). egar templete clasar eru forritair arf a tfra fllin .h skrnni. g hef allaveganna ekki n a skbba v yfir sr skr ...

Matti . - 17/12/03 11:27 #

Gur punktur. a er rtt a template ki arf allur a vera inline, a.m.k. veit g ekki um neinn anda sem gefur manni kost a splitta v upp.

a er gt regla a askilja vimt og tfrslu template ka me v a hafa skilgreininguna sr og tfrsluna near skrnni, .e.a.s. ekki hafa tfrsluna klasaskilgreiningunni. er hgt a fra tfrsluna sr skr og vsa svo hana h skrnni. fr maur a minnsta kosti askilna skilgreiningu og tfrslu fyrir notendur einingar, andinn komist ekki hj v a lesa alla spuna inn hvert skipti sem ntt template tag er nota.

Matti . - 17/12/03 13:30 #

g btti inn sm kadmi fyrir template.

seinna dminu er vissulega mun meiri ki en overheadi er fst str, annig a um lei og tfrslan er flknari, meira en 1-2 lnur, skiptir etta overhead minna mli. Srstaklega ef essi ki er frur sr skr, ar sem minnkar kinn h skrnni verulega, sem er gott.