Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [Design] Problem mit ableitbarer, einzigartiger instanz

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.08.2008, 16:22 Uhr
xXx
Devil


Also, folgendes:
Ich habe zwei Module: foo u. bar.
foo => class a u. braucht zugriff auf diese (einmalige Instanz, allerdings)
bar => class b : public a u. braucht ebenfalls zugriff auf einmalige Instanz.

Nun soll aber der erste Aufruf der Funktion instance (static in a, um einmalige instanz zu ermöglichen) entscheiden, ob eine Instanz von derived oder base genutzt werden soll. Und nach dem ersten aufruf soll es egal sein, ob man a::instance oder b::instance aufruft und beidesmal die selbe instanz zurück gegeben werden.

Wie könnte man das realisieren?

C++:
namespace foo
{
    class a : public uncopyable
    {
    protected:
        virtual ~a() {}

    public:
        inline static a& instance()
        {
            static std::auto_ptr<a> instance(_create_instance());
            return *instance.get();
        }

    protected:
        virtual a*    _create_instance() const { return new a; }

    public:
        virtual std::ostream& instance_name(std::ostream& out) { return out << "a"; }
    };
}; // foo


C++:
namespace bar
{
    class b : public a
    {
    protected:
        virtual a*    _create_instance() const { return new b; }
            
    public:
        virtual std::ostream& instance_name(std::ostream& out) { return out << "b"; }
    };
}; // bar


C++:
int main()
{
    bar::b::instance().instance_name(std::cout); // Ausgabe: b
    foo::a::instance().instance_name(std::cout); // Ausgabe: b
}

Aber so geht es nicht, da _create_instance() nicht static ist, aber in einer statischen Methode aufgerufen wird.

Jemand eine Idee wie ich das realisieren könnte? Vielen danke schonmal!

Dieser Post wurde am 10.08.2008 um 16:22 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.08.2008, 18:12 Uhr
~helferlein
Gast


mach doch _create_instance auch static.

oder du überschreibst in b die instance funktion. dann lieferst du aus der funktion
direkt die richtige klasse
[cpp]
class a
{
//...
inline static a& instance()
{
static std::auto_ptr<a> instance(new a);
return *instance.get();
}
};
class b
{
//...
inline static a& instance()
{
static std::auto_ptr<a> instance(new b);
return *instance.get();
}
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.08.2008, 19:15 Uhr
xXx
Devil


Hast de das ausprobiert? Weil ich geh mal sehr stark davon aus, das a::instance().instace_name(std::cout); dann trotzdem a ausgibt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.08.2008, 20:47 Uhr
Kest
saint


Weiß nicht, ob's geht:

C++:
class A
{
      public:
             virtual void print() const{ std::cout << "A::print" << std::endl; }
            
             static A& instance(){
                    static A _t;
                    return _t.base_instance();
                    }
            
      protected:
                A& base_instance(){
                   static std::auto_ptr<A> _t(make_new());
                   return *_t.get();
                }
                
                virtual A* make_new() const{ return new A(); }
};


class B : public A
{
      public:
             virtual void print() const{ std::cout << "B::print" << std::endl; }
            
             static A& instance(){
                    static B _t;
                    return _t.base_instance();
                    }
            
      protected:
             virtual B* make_new() const{ return new B(); }
};


int main() {
   B::instance().print();
   A::instance().print();

}
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 10.08.2008 um 20:59 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.08.2008, 22:46 Uhr
~xxx_loggedoff
Gast


Also schonmal vielen Dank dAS scheint echt so zu funktionieren Hab nen bissel blockiert gedacht, weil man ja schlecht virtual static machen kann

also vielen danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: