|
| 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
| |
|
|