/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
De har brug for hinanden på kryds og
Fra : Socketd


Dato : 07-08-03 11:08

Hi igen igen

Jeg har (forkortet meget ned) 3 filer med en klasse i hver, fx:
Klasse1
Klasse2
Klasse3

Klasse1 skal have pointers til klasse 2 og klasse 3.

Klasse 2 skal oprette objekter af klasse 1 og have en pointer til klasse
3.

Klasse3 skal oprette objekter af klasse 1 og have en pointer til klasse
2.

Dette problem kan vist ikke løses med #include's og #ifndef KundeSide_h
#define KundeSide_h

 
 
Socketd (07-08-2003)
Kommentar
Fra : Socketd


Dato : 07-08-03 11:11

On Thu, 7 Aug 2003 12:07:50 +0200
Socketd <db@NO_SPAM_traceroute.dk> wrote:

> Hi igen igen
>
> Jeg har (forkortet meget ned) 3 filer med en klasse i hver, fx:
> Klasse1
> Klasse2
> Klasse3
>
> Klasse1 skal have pointers til klasse 2 og klasse 3.
>
> Klasse 2 skal oprette objekter af klasse 1 og have en pointer til
> klasse 3.
>
> Klasse3 skal oprette objekter af klasse 1 og have en pointer til
> klasse 2.
>
> Dette problem kan vist ikke løses med #include's og #ifndef
> KundeSide_h#define KundeSide_h

Så gjorde jeg det igen igen. Hør nu lige her socketd! Det er kun i gaim
ctrl+enter giver en ny linie, her betyder det at du sender en mailen,
forstå det så!!!

Anyway jeg var egentlig færdig...mere eller mindre. Det problem som skal
løses er at de alle jo skal kunne bruge hinanden, men den ene vil gerne
have den anden er erklæret og omvendt.

mvh
socket

Ivan Johansen (07-08-2003)
Kommentar
Fra : Ivan Johansen


Dato : 07-08-03 11:25

Socketd wrote:
> Anyway jeg var egentlig færdig...mere eller mindre. Det problem som skal
> løses er at de alle jo skal kunne bruge hinanden, men den ene vil gerne
> have den anden er erklæret og omvendt.

Hvis du kun skal bruge en pointer til Klasse1 behøver du ikke inkludere
dens header. I stedet skriver du:
class Klasse1;

Du kan derefter lave referencer og pointere til klassen, men du kan ikke
skrive kode som skal kende klassens indhold.

Ivan Johansen


Socketd (07-08-2003)
Kommentar
Fra : Socketd


Dato : 07-08-03 11:39

On Thu, 07 Aug 2003 12:25:13 +0200
Ivan Johansen <NG2@Padowan.dk> wrote:

> Hvis du kun skal bruge en pointer til Klasse1 behøver du ikke
> inkludere dens header. I stedet skriver du:
> class Klasse1;
>
> Du kan derefter lave referencer og pointere til klassen, men du kan
> ikke skrive kode som skal kende klassens indhold.

Pointeren bruges til at kalde en af klassens funktioner.

mvh
socketd

Niels Dybdahl (07-08-2003)
Kommentar
Fra : Niels Dybdahl


Dato : 07-08-03 13:02

> Pointeren bruges til at kalde en af klassens funktioner.

Det kan du også bare ikke i headeren.

Niels Dybdahl



Socketd (07-08-2003)
Kommentar
Fra : Socketd


Dato : 07-08-03 13:58

On Thu, 7 Aug 2003 14:02:25 +0200
"Niels Dybdahl" <ndy@esko-graphics.com> wrote:

> Det kan du også bare ikke i headeren.

Ok, bare lige for at skære det ud i pap:
Du har følgende 3 filer:

Klasse1:
class Klasse1 {
   Klasse2 *kl2;
   public:
   Klasse1(Klasse2 *pointer) {kl2 = pointer;}
   void func() { kl2->test(); }
   void test() { cout<<"Hej 1"<<endl; }
};

Og du har:
Klasse2:
class Klasse2 {
   Klasse1 *kl1;
   public:
   Klasse2(Klasse1 *pointer) {kl1 = pointer;}
   void func() { kl1->test(); }
   void test() { cout<<"Hej 2"<<endl; }
};

Og til sidst:
Klasse3:
class Klasse3 {
   Klasse1 *kl1;
   public:
   Klasse3(Klasse1 *pointer) {kl1 = pointer;}
   void test() { Klasse2 nyKlasse(kl1); }
};

Jeg har tit været ude for at mit program ikke kunne kompile, hvis de
rigtige #include, ikke var de rigtige steder. Jeg vil gerne kunne lave
en klasse så den bare kan include det den skal og også selv blive
indkluded, uden nogle problemer. Så hvordan vil ovenstående se ud hvis
det skal være helt perfekt?

mvh
socketd

Michael Bülow Jensen (07-08-2003)
Kommentar
Fra : Michael Bülow Jensen


Dato : 07-08-03 14:55


"Socketd" <db@NO_SPAM_traceroute.dk> wrote in message
news:20030807145747.41df295d.db@NO_SPAM_traceroute.dk...
On Thu, 7 Aug 2003 14:02:25 +0200
"Niels Dybdahl" <ndy@esko-graphics.com> wrote:

<SNIP>
Et eksempel med tre klasser som du vil have til at kompilere
</SNIP>

....Så hvordan vil ovenstående se ud hvis det skal være helt perfekt?



Ved nu ikke ligefrem om det er "helt perfekt", men det virker :)
Der er 6 filer ialt (Klasse1.h, Klasse1.cpp, Klasse2.h, Klasse2.cpp,
Klasse3.h, Klasse3.cpp)

/*********** Klasse1.h ***********/

#ifndef KLASSE1_H__INCLUDED
#define KLASSE1_H__INCLUDED

class Klasse2;

class Klasse1
{
Klasse2 *kl2;
public:
Klasse1(Klasse2 *pointer);
void func();
void test();
};

#endif //KLASSE1_H__INCLUDED

/*********** Klasse1.cpp ***********/

#include "Klasse1.h" //Klassens egen header
#include "Klasse2.h" //Klasse2's header. Så er klassen defineret, og
funktionerne kan kaldes
#include <iostream>

Klasse1::Klasse1(Klasse2 *pointer)
{
kl2 = pointer;
}

void Klasse1::func()
{
kl2->test();
}

void Klasse1::test()
{
std::cout << "Hej 1" << std::endl;
}

/*********** Klasse2.h ***********/

#ifndef KLASSE2_H__INCLUDED
#define KLASSE2_H__INCLUDED

class Klasse1;

class Klasse2
{
Klasse1 *kl1;
public:
Klasse2(Klasse1 *pointer);
void func();
void test();
};

#endif //KLASSE2_H__INCLUDED

/*********** Klasse2.cpp ***********/

#include "Klasse2.h" //Klassens egen header
#include "Klasse1.h" //Klasse1's header. Så er klassen defineret, og
funktionerne kan kaldes
#include <iostream>

Klasse2::Klasse2(Klasse1 *pointer)
{
kl1 = pointer;
}

void Klasse2::func()
{
kl1->test();
}

void Klasse2::test()
{
std::cout << "Hej 2" << std::endl;
}

/*********** Klasse3.h ***********/

#ifndef KLASSE3_H__INCLUDED
#define KLASSE3_H__INCLUDED

class Klasse1;

class Klasse3
{
Klasse1 *kl1;
public:
Klasse3(Klasse1 *pointer);
void func();
void test();
};

#endif //KLASSE3_H__INCLUDED

/*********** Klasse3.cpp ***********/

#include "Klasse3.h" //Klassens egen header
#include "Klasse1.h" //Klasse1's header. Så er klassen defineret, og
funktionerne kan kaldes
#include <iostream>

Klasse3::Klasse3(Klasse1 *pointer)
{
kl1 = pointer;
}

void Klasse3::func()
{
kl1->test();
}

void Klasse3::test()
{
std::cout << "Hej 3" << std::endl;
}



Mvh Michael



Socketd (07-08-2003)
Kommentar
Fra : Socketd


Dato : 07-08-03 15:04

On Thu, 07 Aug 2003 15:26:09 +0200
Ivan Johansen <NG2@Padowan.dk> wrote:

> Her inkluderes headeren til Klasse2 eller Klasse3::test() flyttes til
> en cpp-fil. Før klassen skrives:
> class Klasse1;
>
> Generelt fortælle "class Klasse;" at Klasse eksisterer men ikke hvad
> den indeholder. Du kan derfor godt lave en pointer til den, men du kan
> ikke kalde funktioner i Klasse uden hele definitionen.

Ok, det vil sige at:
Klasse1.h:
#ifndef Klasse1_h
#define Klasse1_h
class Klasse2;
class Klasse1 {
   Klasse2 *kl2;
   public:
   Klasse1(Klasse2 *pointer);
   void func();
   void test();
};

#endif

Klasse1.c:
#ifndef Klasse1_c
#define Klasse1_c
Klasse1::Klasse1(Klasse2 *pointer) {kl2 = pointer;}

Klasse1::func() { kl2->test(); }

Klasse1::void test() { cout<<"Hej 1"<<endl; }

#endif

Hvis jeg så laver en main.c, hvordan skal jeg så sikre mig at alle .h
filer bliver set først (så vi ikke når en .c som bruger en klasse hvis
..h endnu ikke er indlæst)?
Bjarne skriver at man i Klasse1.c skal skrive #include Klasse1.h, men
hvad så når man i main.c kun includer Klasse1.h, hvordan kommer
Klasse1.c så med?

Jeg kan heller ikke se hvordan ovenstående kan løses med #include. Fordi
hvis vi satte #include "Klasse1.h" som det første i Klasse2 og omvendt i
Klasse1, så ligemeget hvordan vi includer fra main vil vi jo nå enten
class Klasse1 eller class Klasse2 før vi når den anden. Så skal man ikke
bruge class KlasseX; ved begge klasser?

mvh
socketd

Socketd (07-08-2003)
Kommentar
Fra : Socketd


Dato : 07-08-03 15:29

On Thu, 7 Aug 2003 15:54:35 +0200
"Michael Bülow Jensen" <mbulow_trygmed@pc.dk> wrote:

> Ved nu ikke ligefrem om det er "helt perfekt", men det virker :)

Det er så smuk så smuk

> Der er 6 filer ialt (Klasse1.h, Klasse1.cpp, Klasse2.h, Klasse2.cpp,
> Klasse3.h, Klasse3.cpp)

Har lige et sidste spørgsmål (tror jeg), hvis du har en main.c som vil
bruge fx Klasse3, så skal du i main.c have #include "Klasse.h" ikke? Men
hvor nu at få alle .c'erne med, skal de forskellige .h filer så ikke
lige have en #include "sigSelv.c" til sidst?

mvh
socketd

Niels Dybdahl (08-08-2003)
Kommentar
Fra : Niels Dybdahl


Dato : 08-08-03 07:36

> Har lige et sidste spørgsmål (tror jeg), hvis du har en main.c som vil
> bruge fx Klasse3, så skal du i main.c have #include "Klasse.h" ikke? Men
> hvor nu at få alle .c'erne med, skal de forskellige .h filer så ikke
> lige have en #include "sigSelv.c" til sidst?

..c og .cpp filerne bliver kompileret separat, så de skal aldrig inkludere
hinanden eller inkluderes fra .h filerne. Linkeren samler alle de
kompilerede filer og checker om der mangler noget.

Niels Dybdahl




Kent Friis (08-08-2003)
Kommentar
Fra : Kent Friis


Dato : 08-08-03 09:08

Den Fri, 8 Aug 2003 08:35:51 +0200 skrev Niels Dybdahl:
>> Har lige et sidste spørgsmål (tror jeg), hvis du har en main.c som vil
>> bruge fx Klasse3, så skal du i main.c have #include "Klasse.h" ikke? Men
>> hvor nu at få alle .c'erne med, skal de forskellige .h filer så ikke
>> lige have en #include "sigSelv.c" til sidst?
>
>.c og .cpp filerne bliver kompileret separat, så de skal aldrig inkludere
>hinanden eller inkluderes fra .h filerne. Linkeren samler alle de
>kompilerede filer og checker om der mangler noget.

C-pre-processor filer (.cpp) skal da inkluderes, ellers giver de slet
ingen mening.

Mvh
Kent
--
Linux 0.12 is out
Windows 2003 is now obsolete!!!

Kim Hansen (08-08-2003)
Kommentar
Fra : Kim Hansen


Dato : 08-08-03 09:18

leeloo@phreaker.net (Kent Friis) writes:

> Den Fri, 8 Aug 2003 08:35:51 +0200 skrev Niels Dybdahl:
> >
> >.c og .cpp filerne bliver kompileret separat, s~ de skal aldrig inkludere
> >hinanden eller inkluderes fra .h filerne. Linkeren samler alle de
> >kompilerede filer og checker om der mangler noget.
>
> C-pre-processor filer (.cpp) skal da inkluderes, ellers giver de slet
> ingen mening.

..cpp er C++ filer

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-´` -. ;:-. | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Tlf: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Kent Friis (08-08-2003)
Kommentar
Fra : Kent Friis


Dato : 08-08-03 09:24

Den 08 Aug 2003 10:17:54 +0200 skrev Kim Hansen:
>leeloo@phreaker.net (Kent Friis) writes:
>
>> Den Fri, 8 Aug 2003 08:35:51 +0200 skrev Niels Dybdahl:
>> >
>> >.c og .cpp filerne bliver kompileret separat, s~ de skal aldrig inkludere
>> >hinanden eller inkluderes fra .h filerne. Linkeren samler alle de
>> >kompilerede filer og checker om der mangler noget.
>>
>> C-pre-processor filer (.cpp) skal da inkluderes, ellers giver de slet
>> ingen mening.
>
>.cpp er C++ filer

Med hvilken defekt compiler? CPP har da været forkortelsen for
C-pre-processor siden før C++ blev opfundet.

C++ filer plejer da at hedde .cc eller .cxx

Mvh
Kent
--
Linux 0.12 is out
Windows 2003 is now obsolete!!!

Ivan Johansen (08-08-2003)
Kommentar
Fra : Ivan Johansen


Dato : 08-08-03 09:54

Kent Friis wrote:
> Med hvilken defekt compiler? CPP har da været forkortelsen for
> C-pre-processor siden før C++ blev opfundet.
>
> C++ filer plejer da at hedde .cc eller .cxx

Jeg kender kun g++ som bruger .cc og .cxx. Både Borland, Microsoft og
flere andre bruger .cpp. Men der er vist ingen lov der siger hvordan en
c++ fil skal navngives.

Ivan Johansen


Kent Friis (08-08-2003)
Kommentar
Fra : Kent Friis


Dato : 08-08-03 10:03

Den Fri, 08 Aug 2003 10:54:16 +0200 skrev Ivan Johansen:
>Kent Friis wrote:
>> Med hvilken defekt compiler? CPP har da været forkortelsen for
>> C-pre-processor siden før C++ blev opfundet.
>>
>> C++ filer plejer da at hedde .cc eller .cxx
>
>Jeg kender kun g++ som bruger .cc og .cxx. Både Borland, Microsoft og
>flere andre bruger .cpp. Men der er vist ingen lov der siger hvordan en
>c++ fil skal navngives.

Nej, men når CPP allerede var optaget, er det da kun at forvirre både
programmøren og compileren at genbruge forkortelsen.

Mvh
Kent
--
"Intelligence is the ability to avoid doing work, yet get the work done"
- Linus Torvalds

Socketd (07-08-2003)
Kommentar
Fra : Socketd


Dato : 07-08-03 16:53

On Thu, 7 Aug 2003 16:04:27 +0200
Socketd <db@NO_SPAM_traceroute.dk> wrote:

> Hvis jeg så laver en main.c, hvordan skal jeg så sikre mig at alle .h
> filer bliver set først (så vi ikke når en .c som bruger en klasse hvis
> .h endnu ikke er indlæst)?

> Bjarne skriver at man i Klasse1.c skal skrive #include Klasse1.h, men
> hvad så når man i main.c kun includer Klasse1.h, hvordan kommer
> Klasse1.c så med?
>
> Jeg kan heller ikke se hvordan ovenstående kan løses med #include.
> Fordi hvis vi satte #include "Klasse1.h" som det første i Klasse2 og
> omvendt i Klasse1, så ligemeget hvordan vi includer fra main vil vi jo
> nå enten class Klasse1 eller class Klasse2 før vi når den anden. Så
> skal man ikke bruge class KlasseX; ved begge klasser?

Jeg har vist fået svar på det, bare se bort fra dette indlæg

mvh
socketd

Socketd (08-08-2003)
Kommentar
Fra : Socketd


Dato : 08-08-03 09:01

On Fri, 08 Aug 2003 08:41:10 +0200
Ivan Johansen <NG2@Padowan.dk> wrote:

> Jeg tror at der er noget du har misforstået. Du inkludere aldrig
> c-filer men kun h-filer. Du compiler så hver c-fil for sig og linker
> dem sammen til sidst.

Nå ok, det gør den vist ikke automatisk (g++)? Men det er vel derfor vi
har Makefile's.

Jeg takker jer alle for jeres svar, I har været en stor hjælp

mvh
socketd

Socketd (08-08-2003)
Kommentar
Fra : Socketd


Dato : 08-08-03 10:26

On Fri, 08 Aug 2003 10:51:06 +0200
Ivan Johansen <NG2@Padowan.dk> wrote:

> Jo da, men g++ vil vist gerne have at c++ filer hedder .cc
> Prøv med:
> g++ fil1.cc fil2.cc fil3.cc -o program

Ok, jeg plejer at kalde dem .cpp (og enkelte gange .c), troede ikke der
var nogen forskel på det. Men takker igen

mvh
socketd

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste