Avatar billede kernelx Juniormester
10. januar 2007 - 00:58 Der er 5 kommentarer og
1 løsning

hvilken class må hvad?

hi,

jeg har fire c++-classes

class c1
{
    public/private:
    ...
};

class c2
{
    public/private:
        c1 test;    // ok
};

class c3
{
    public/private:
        c1 test;    // ok
        c2 test2;    // ok
};

// c4 står for alle muglige andre class'es
class c4
{
    public/private:
        c1 test;    // fejl
        c2 test2;    // fejl
        c3 test3;    // ok
};
---------

kan man få alle øvrige class'es til ikke at kende c1 og c2? sådan at kun c3 kender begge class'es. c1 og c2 skal kunde kende hinanden.
alle andre class'es skal alligevel have muligheden for at bruge c3.

med venlig hilsen
KernelX
Avatar billede bertelbrander Novice
10. januar 2007 - 01:05 #1
Man kan i nogen omfang løse problemet med en kombination af friend og private constructor:

class c1
{
private:
  friend class c2;
  friend class c3;
  c1() {}
};

class c2
{
private:
  c1 test;    // ok
  friend class c1;
  friend class c3;
  c2() {}
};

class c3
{
private:
  c1 test;    // ok
  c2 test2;    // ok
};

// c4 står for alle muglige andre class'es
class c4
{
public:
  c1 test;    // fejl
  c2 test2;    // fejl
  c3 test3;    // ok
};

int main()
{
  c3 x;
  c4 y;
}

Men det er ikke nogen specielt "køn" løsning.
Hvordan en bedre løsning ville se ud afhænger af anvendelse, f.eks. skal brugere af c3  kende noget til c1 og c2?
Avatar billede kernelx Juniormester
10. januar 2007 - 02:55 #2
c3 skal kende noget til c1 og c2
Avatar billede segmose Nybegynder
10. januar 2007 - 12:00 #3
Jeg kan huske jeg har lavet noget lignende dette, men det kunne være en compiler specific implementation om man må erklære classes inden i hinanden.

class c3 {
  class c1 {
    public/private:
    ...
  };

  class c2 {
    public/private:
      c1 test;    // ok
  };

  public/private:
        c1 test;    // ok
        c2 test2;    // ok
};

// c4 står for alle muglige andre class'es
class c4
{
    public/private:
        c1 test;    // fejl
        c2 test2;    // fejl
        c3 test3;    // ok
};
Avatar billede bertelbrander Novice
10. januar 2007 - 19:46 #4
Man må godt lave class'er inden i hinanden.
Avatar billede kernelx Juniormester
12. januar 2007 - 17:47 #5
man må også godt skrive svar :-)
alle som svarer, for points - denne gang er det desværre kun 60
Avatar billede segmose Nybegynder
13. januar 2007 - 10:08 #6
Så la så da!
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