Avatar billede conrad Nybegynder
30. juli 2003 - 10:44 Der er 11 kommentarer og
2 løsninger

klasse deklarations spørgsmål

hvad betyder:DSRAgent::DSRAgent(): Agent(PT_DSR), request_table(128),route_caching()...

DSRAgent::DSRAgent(): Agent(PT_DSR): tror jeg selv betyder DSRAgent extender Agent og tilhører DSRAgent klassen. Det er mere de efterfølgende , , , jeg er i tvivl om (er det interfaces?)

Man må forøvrigt ikke skrive ): i  sin overskrift:

Følgende felter er ikke korrekte :

* ") :" er ikke med til at beskrive dit problem, så formuler venligst en bedre titel.
Avatar billede jpk Nybegynder
30. juli 2003 - 10:47 #1
Det der kommer efter : i constructoren kaldes initialiser list, det er bare tildeling af værdier
Avatar billede arne_v Ekspert
30. juli 2003 - 10:48 #2
Det er en constructor for klassen DSRAgent som har arvet fra
Agent, request_table og route_caching.

I C++ kan man arve fra flere klasser.
Avatar billede arne_v Ekspert
30. juli 2003 - 10:50 #3
Vær endvidere opmærksom på at hvis en klasse indeholder et objekt
af en klasse og ikke kun en pointer til den, så skal det objekt også
initialiseres i constructoren på denne måde (fordi det reeelt er
det samme som at arve fra den klasse).
Avatar billede conrad Nybegynder
30. juli 2003 - 11:21 #4
Jeg synes jpk's forklaring passer bedst i dette tilfælde da jeg kan se request_table og route_cahce for tildelt værdier inde i constructoren.

Hvorfor gør man det på den måde? Er det "smart"?
Avatar billede arne_v Ekspert
30. juli 2003 - 11:27 #5
Hvis du har en klasse som indeholder andre klasser (ikke kun pointere
til), så mener jeg at de skal initialisers der for at det compiler !
Avatar billede arne_v Ekspert
30. juli 2003 - 11:28 #6
Og det er efter min personlige opfattelse en meget god grund til
altid kun at lade klasser indeholde pointere til andre klasser og
så kalde deres constructorer i new i ens constructor.
Avatar billede arne_v Ekspert
30. juli 2003 - 11:49 #7
Her er et eksempel som illusterer:

#include <iostream>

using namespace std;

class C1
{
  private:
      int value;
  public:
      C1(int v) { value = v; };
      void print() { cout << value << endl; };
};

class C2
{
  public:
      C2() { };
};

class C3 : public C1, C2
{
  public:
      C3() : C2(), C1(3) { };
};

class C4 : public C2
{
  private:
      C1 o1;
  public:
      C4() : C2(), o1(4) { };
      void print() { o1.print(); };
};

class C5 : public C2
{
  private:
      C1 *o1;
  public:
      C5() : C2() { o1 = new C1(5); };
      void print() { o1->print(); };
};

int main()
{
  C3 o3;
  o3.print();
  C4 o4;
  o4.print();
  C5 o5;
  o5.print();
}
Avatar billede arne_v Ekspert
30. juli 2003 - 11:50 #8
Jeg kan ikke sige om det er en C3 eller C4 du har.

Og jeg synes som sagt at C5 er betydeligt kønnere end C4.

Smag og behag er forskellig.
Avatar billede jpk Nybegynder
30. juli 2003 - 12:58 #9
arne >> til dit indlæg af 10:50:59:

"hvis en klasse indeholder et objekt af en klasse og ikke kun en pointer til den, så skal det objekt også initialiseres i constructoren på denne måde".
Det er kun sandt i det tilfælde hvor der ikke eksisterer en (parameterløs) default constructor.

Med "fordi det reeelt er det samme som at arve fra den klasse" hentyder du måske til hvad der foregår bag facaden? Vi må da kunne enes om, at det designmæssigt IKKE er det samme..?


Så er der jo endelig også en anden forskel mht. brugen af initializer lists, nemlig performance. I tilfælde hvor både constructor og evt. assignment metoder allokerer hukommelse vil man kunne "spare" et sådant kald.
Avatar billede arne_v Ekspert
30. juli 2003 - 13:17 #10
Det er rigtigt at parameter løse constructors kan udelades. Men det
gælder også for både arvede klasser og indeholdte klasser.

Om der er forskel på arv og indeholdt klasse. Ja - der er jo
en åbenlys syntax forskel. Men både med hensyn til hvad der faktisk
sker og rent begrebsmæssigt er de meget ens.

Vi er helt enige om at det ikke er hensigtsmæssigt først at kalde
en constructor i en init liste og så lave det hele om i selve
constructoren.
Avatar billede arne_v Ekspert
30. juli 2003 - 13:20 #11
Mit eksempel kune iøvrigt gøres endnu mere tydelig ved at gøre  o1 public:

#include <iostream>

using namespace std;

class C1
{
  private:
      int value;
  public:
      C1(int v) { value = v; };
      void print() { cout << value << endl; };
};

class C2
{
  public:
      C2() { };
};

class C3 : public C1, C2
{
  public:
      C3() : C2(), C1(3) { };
};

class C4 : public C2
{
  public:
      C1 o1;
      C4() : C2(), o1(4) { };
};

class C5 : public C2
{
  public:
      C1 *o1;
      C5() : C2() { o1 = new C1(5); };
};

int main()
{
  C3 o3;
  o3.print();
  C4 o4;
  o4.o1.print();
  C5 o5;
  o5.o1->print();
}
Avatar billede segmose Nybegynder
30. juli 2003 - 13:44 #12
Har C5 ikke nogle problemer med exception, jeg mener at kunne huske at Bjarne skrev noget om det i sin bibel.
Avatar billede conrad Nybegynder
30. juli 2003 - 16:31 #13
Tak for svaret begge to :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester