Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:13 Der er 17 kommentarer og
1 løsning

"Sikre" klasser

Hej...

Vil gerne bruge pointers så lidt som muligt og har en klasse lignede denne:

class Foo
{
  public:
  Foo();
  ~Foo();

  private:
  EnAndenKlasse *klasse;
};

Foo::Foo()
{
  klasse = new EnAndenKlasse();
}

Foo::~Foo()
{
  delete klasse;
}

Hvordan undgår jeg brug af pointers? Med fx "int" er det jo let nok, men det virker tilsyndeladende ikke på samme måder når vi snakker klasser. Er ret sikker på at det er et rimelig "basic" spørgsmål, men er ikke for god og har købt en bog (Accerated C++) som jeg håber kan fortælle mig en del...
Avatar billede arne_v Ekspert
13. juni 2006 - 19:24 #1
Du kan godt bruge:


class Foo
{
  ...
  EnAndenKlasse klasse;
};

du skal bare huske at bruge:

Foo::Foo() : EnAndenKlasse()
{
}

men generelt vil jeg fraraade at bruge den konstruktion - det er tungt og
ufleksibelt
Avatar billede arne_v Ekspert
13. juni 2006 - 19:25 #2
og husk saa at det er strengt forbudt at have en pointer som member uden at have
baade copy constructor og assignment operator
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:28 #3
copy constructor?
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:31 #4
der hvor jeg vil bruge det, er hvor jeg normalt brugte struct i c#... fx i en klasse som er en rektangle hvor jeg har en klasse gemt som er en moddet "point" og en moddet "size". "point" og "size" indeholder 2 unsigned shorts, så ville jo være dumt også at gemme en pointer aka. int... kommer måske til at have nogle 1000
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:34 #5
altså, i den rektangle vil der være 4 shorts, og hvis jeg laver det som pointere bliver det 4 shorts + 2 ints dvs. fylder dobbelt så meget
Avatar billede arne_v Ekspert
13. juni 2006 - 19:36 #6
Foo(Foo& o)

er en copy constructor for Foo
Avatar billede arne_v Ekspert
13. juni 2006 - 19:36 #7
hvorfor bruger du ikke ogsaa struct i C++ saa

(faktisk er en struct stort set det samme som en class i C++ men default access
er saaledes at du kan bruge en struct C style i C++)
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:37 #8
ahh okay...

og i den skal jeg vel så initialize en ny Foo og sætte de samme settings...
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:38 #9
nemlig det jeg havde læst... nemlig at det var det samme undtagen den default access..., så synes det er lettest bare at bruge det samme... skriver også altid "public:" og "private:" da jeg synes der er mere styr over det...
Avatar billede arne_v Ekspert
13. juni 2006 - 19:44 #10
struct FooHelper
{
  int a;
  int b;
  int c;
  int d;
};

og

class Foo
{
    ...
      FooHelper data;
};

og

Foo::Foo()
{
    data.a = 1;
    data.b = 2;
    data.c = 3;
    data.d = 4;
}
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:47 #11
yup... fandt ud af hvad jeg havde gjort forkert :/ pinligt... havde ingen () constructor... i c# er der en uanset hvad i en struct
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 19:49 #12
man får næsten for meget hjælp i c# :D
Avatar billede arne_v Ekspert
13. juni 2006 - 19:51 #13
C# -> C++ kan godt give lidt graa haar

f.eks. hvis man glemmer det i 19:25:49
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 20:00 #14
assignment operator? hint
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 20:02 #15
og så må du lige oprette svar
Avatar billede arne_v Ekspert
13. juni 2006 - 20:04 #16
void Foo::operator=(const Foo& o)
Avatar billede arne_v Ekspert
13. juni 2006 - 20:05 #17
svar
Avatar billede mysitesolution Nybegynder
13. juni 2006 - 20:10 #18
tak
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