Gå til innhold

klasser som trenger hverandre


Anbefalte innlegg

jeg har et problem jeg skal ha 2 klasser den ene skal ha en ha en pointer til den andre. Når jeg prøver på dette får jeg problemer med dette siden når man kompilerer så "vet" jo ikke kompilatoren om den andre klassen før den har lest deklarasjonen som den da ikke kan lese uten å ha lest hele deklarasjonen først

:dontgetit: på en annen måte

 

klasse1 en har klasse 2 som member og klasse2 har klasse1 som menber åssen gjør jeg det.

 

PS: 1. Beklager dårlig overskrift

2. Det kan tid før jeg får svart

Lenke til kommentar
Videoannonse
Annonse

Enkel løsning;

 

#include <iostream>

using namespace std;


template<class T>
class A {
public:
       void func()
       {
               cout << b.i << endl;
       } // func


       T b;
}; // A


class B {
public:
       int i;
}; // B


int main()
{
       A<B> a;
       a.b.i = 1234;
       a.func();
       return(0);
} // main

 

Edit:

Fordi det eirikhm nevner kun fungerer i de enkleste tilfeller. :]

 

Edit2:

Irriterende at det finnes to memberfunction-operators (eller hva de kalles); operator.() og operator->() ...

Endret av søppel
Lenke til kommentar

Irriterende at det finnes to memberfunction-operators (eller hva de kalles); operator.() og operator->() ...

Da jeg først begynte med C++ ante jeg ikke forskjellen på disse, og jeg prøvde først den ene. Dersom den ikke kompilerte, så brukte jeg den andre.

 

Nå synes jeg det er praktisk at man kan bruke både objekter (.) og pekere (->).

 

someclass a;
someclass *b =new someclass();

a.afunction();
b->afunction();

delete b;

Endret av JBlack
Lenke til kommentar

D virker interesannt egentlig, men hvor "stabilt " er det, er det noe større prgramvare skrevet i det? Og dette med "garbage collector" har jeg ikke troen på i /alle/ tilfeller, MÅ man bruke den eller kan man eksplisitt destruere objekter?

 

JBlack, joda - jeg er fullstendig klar over når man skal bruke de forskjellige i praksis. Det var ikke derfor jeg nevnte det jeg nevnte. :]

Endret av søppel
Lenke til kommentar
D virker interesannt egentlig, men hvor "stabilt " er det, er det noe større prgramvare skrevet i det? Og dette med "garbage collector" har jeg ikke troen på i /alle/ tilfeller, MÅ man bruke den eller kan man eksplisitt destruere objekter?

Ds spesifikasjon er vel ikke fullstendig klar ennå, men så vidt jeg forstår nærmer språket seg 1.0. Skal man tro folk på nyhetsgruppen genererer også kompilatoren stødig og rask kode. Har ikke funnet noe informasjon om det, men tviler på at folk har skrevet større programmer i D, med tanke på at det er under utvikling ennå. Men for mine private formål nøler jeg ikke med å ta i bruk noe som forhåpentligvis skjærer ned tiden brukt på å skrive kode (er ikke kjent med alle detaljene ennå, men det meste sitter) :_)

 

Du har muligheten til å konstruere/destruere selv, du kan til og med kalle free/malloc for interfacing med C-API'er. Så vidt jeg forsto skal det være mulig skru av GC, men det var en bug som gjorde at GC overså forespørselen (kanskje fikset nå). D støtter også RAII ved at objekter kan deklareres som "auto", og destrueres straks de går ut av skop (likegyldig om de er på stack eller heap). En strek i regningen er at jeg ikke får til å debugge programmene vha. gdb, dmd skal generere gdb-kompatibel informasjon, men det ser ikke ut til å fungere. Jeg vil i alle fall foreslå at du tar en kikk på Ds hjemmeside, og gjør deg opp en mening ved hjelp av språkbeskrivelsen der.

Lenke til kommentar
  • 2 uker senere...

JBlack:

#include <iostream>

using namespace std;


template<class T>
class A {
public:
       void func()
       {
               cout << b.i << endl;
       } // func


       T b;
}; // A


class B {
public:
       int i;
}; // B


int main()
{
       A<B> a1;
       a1.b.i = 1234;
       a1.func();


       A<B*> a2;
       a2.b = new B;
       a2.b->i = 4321;
       a2.func();
       delete(a2.b);

       return(0);
} // main

Lenke til kommentar

en template løsning på det problemet syns jeg er utrolig stygt.

For det første må du skrive A<b> bah; hver gang du lager et objekt når du egentlig bare skal skrive A bah; templates er til for å generalisere klasser, i hvertfall i denne konteksten, men denne klassen skal ikke være generalisert. derfor syns jeg det er bedre å bruke en forward declaration

Endret av saboi
Lenke til kommentar
en template løsning på det problemet syns jeg er utrolig stygt.

 

Nå er template i utgangspunktet styggt...

I frykt for å virke dum, hva er template egentlig? jeg er mer en C med klassestøtte en C++ kar.

 

What? D? B er jo fra 1969, C er fra 1972... og D er fra 2005? det er jo en latterlig utvikling...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...