Avatar billede Simon Praktikant
23. december 2003 - 20:54 Der er 11 kommentarer og
1 løsning

class singleton static attribut

Hej, jeg vil gerne oprette en klasse(CModerKlasse) som har en pointer af typen CModerKlasse. Denne pointer skal være static (static CMinModerKlasse* _instance;). Det er fordi jeg gerne vil bruge Singleton pattern. Idéen er nu at alle de klasser som arver fra CModerKlasse, hver især skal have en static pointer af typen CModerklasse, fordi hver af disse klasser skal opføre sig som Singletons.
Men de får ikke hver deres pointer. Både klasse "CArving1" og "CArving2" deles om den samme statiske pointer, men de skal have en hver.
Jeg kunne sagtens løse problemet ved at oprette en statisk pointer i hver af klasserne "CArving1" og "CArving2" , men findes der ikke en smartere måde, således at pointeren kan erklæres i CModerKlasse?
/****************************************/
class CModerKlasse
{
public:
CMinModerKlasse();
static CMinModerKlasse* Instance();
static CMinModerKlasse* _instance;
};
/****************************************/
class CArving1 : public CModerKlasse
{
CArving1();
}
/****************************************/
class CArving2 : public CModerKlasse
{
CArving2();
}
Avatar billede arne_v Ekspert
23. december 2003 - 20:58 #1
C++ tillader ikke virtuelle attributter.

Beklager.

Den bedste C++ løsning efter min mening vil være at lave
en template som "moder" og så lade "arvingene" bruge den
template.
Avatar billede Simon Praktikant
23. december 2003 - 21:10 #2
hvorfor skulle attributterne være virtuelle?
og hvad mener du med en template?
Avatar billede arne_v Ekspert
23. december 2003 - 21:13 #3
Dit problem ville jo være løst hvis der eksisterede virtuelle attributter
ligesom der eksisterer virtuelle metoder.

Fordi så overskrev arvingenes attribut moderens attribut.
Avatar billede arne_v Ekspert
23. december 2003 - 21:14 #4
Med template mener jeg template funktionaliteten i C++, hvor man
bl.a. kan lave en template og bruge den til at oprette forskellige
klasser udfra samme kode.
Avatar billede Simon Praktikant
23. december 2003 - 21:16 #5
ok, ja det kan jeg godt se.
men hvad mener du så med at oprette "moder" som en template? er det noget lignende arv?
Avatar billede arne_v Ekspert
23. december 2003 - 21:27 #6
Ja.

Skal jeg prøve at bixe et eksempel ?
Avatar billede Simon Praktikant
23. december 2003 - 21:36 #7
ja, det ville jeg sætte pris på.
Avatar billede arne_v Ekspert
23. december 2003 - 22:06 #8
Det her simple eksempel illustrerer min ide:

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

template<class T, int id>
class Singleton
{
  private:
      static Singleton *_instance;
  protected:
      Singleton()
      {
      };
  public:
      static Singleton *Instance()
      {
        if(_instance == NULL)
        {
            _instance = new Singleton();
        }
        return _instance;
      }
      T Data;
};

Singleton<int,1> *Singleton<int,1>::_instance = NULL;
Singleton<int,2> *Singleton<int,2>::_instance = NULL;
Singleton<string,3> *Singleton<string,3>::_instance = NULL;

int main()
{
  Singleton<int,1> *s1 = Singleton<int,1>::Instance();
  s1->Data = 123;
  Singleton<int,2> *s2 = Singleton<int,2>::Instance();
  s2->Data = 456;
  Singleton<string,3> *s3 = Singleton<string,3>::Instance();
  s3->Data = "ABC";
  cout << s1->Data << " " << s2->Data << " " << s3->Data << endl;
  return 0;
}
Avatar billede Simon Praktikant
23. december 2003 - 22:13 #9
ok, tak skal du have. Det ser lige lidt nyt ud, men jeg tror godt jeg er lidt med.
Hvad nu hvis jeg i én enkelt af klasserne ville have en funktion, måske beregn_dit_og_dat()?
Giver templates også rum for den slags?
Avatar billede arne_v Ekspert
23. december 2003 - 22:42 #10
Det er faktisk også rimeligt nyt for mig, men jeg prøver lige at
bixe noget.
Avatar billede arne_v Ekspert
23. december 2003 - 23:06 #11
Hm - det er faktisk svært !

Følgende virker men er en god kandidat til "mest suspekte brug
af templates i år 2003":

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

template<class T, int id>
class Singleton
{
  protected:
      static Singleton *_instance;
      Singleton()
      {
      };
  public:
      static Singleton *Instance()
      {
        if(_instance == NULL)
        {
            _instance = new Singleton();
        }
        return _instance;
      }
      T Data;
};

template<int id>
class StringSingleton : public Singleton<string,id>
{
  public:
      void dup()
      {
          Data = Data + Data;
      }
};

Singleton<int,1> *Singleton<int,1>::_instance = NULL;
Singleton<int,2> *Singleton<int,2>::_instance = NULL;
Singleton<string,3> *Singleton<string,3>::_instance = NULL;
Singleton<string,101> *Singleton<string,101>::_instance = NULL;
Singleton<string,102> *Singleton<string,102>::_instance = NULL;

int main()
{
  Singleton<int,1> *s1 = Singleton<int,1>::Instance();
  s1->Data = 123;
  Singleton<int,2> *s2 = Singleton<int,2>::Instance();
  s2->Data = 456;
  Singleton<string,3> *s3 = Singleton<string,3>::Instance();
  s3->Data = "ABC";
  cout << s1->Data << " " << s2->Data << " " << s3->Data << endl;
  StringSingleton<101> *ss1 = (StringSingleton<101>*)StringSingleton<101>::Instance();
  ss1->Data = "ABC";
  StringSingleton<102> *ss2 = (StringSingleton<102>*)StringSingleton<102>::Instance();
  ss2->Data = "abc";
  cout << ss1->Data << " " << ss2->Data << endl;
  ss1->dup();
  ss2->dup();
  cout << ss1->Data << " " << ss2->Data << endl;
  return 0;
}
Avatar billede Simon Praktikant
23. december 2003 - 23:12 #12
ok, du har ret, det er lidt svært. Jeg tror bare at det forvirrer mere end det gavner. Jeg holder mig bare til min oprindelige løsning med at erklære _instance i hver af arvingerne. Men det med templates ser da spændende ud alligevel. :-)
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