Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekte vergleichen -> Singleton

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 < [ 2 ]
000
08.07.2003, 10:36 Uhr
~reza
Gast


Hallo,

wie kann man zwei Objekte miteinander vergleichen, ob sie die gleicher
Adresse im Speicher haben.

Z.B.

// Singleton
// Hier wird das Objekt nicht auf der Heap erzeugt, sonst müsste man
// eine extra Methode zur Verfügung stellen, um das Objekt wieder frei zugeben.

Control& Control::getInstance(void)
{
static Control instance;
return instance;
}

// Objekt erzeugen

Control* deviceControl = &Control::getInstance();

Was passiert, wenn ich noch einmal die Methode getInstance() aufrufe ??

Wird wieder ein neues Objekt erzeugt, da ich nicht mit new arbeite oder
wird die gleiche Adresse zurückgegeben???
Was passiert hier wirklich?

Control* deviceTest = &Control::getInstance();

Wie kann ich das Objekt deviceControl mit dem deviceTest vergleichen?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2003, 11:28 Uhr
ao

(Operator)


Die Instanz wird beim Programmstart angelegt und am Ende zerstört. Dazwischen ist sie immer da, und sie ist die einzige. Das ist das Charakteristische am Singleton.

Es wird niemals "wieder ein neues Objekt erzeugt"; jeder Aufruf von getInstance liefert dasselbe Objekt.

Der Vergleich mit deviceTest ist deshalb unnötig, denn bei einem richtig programmierten Singleton gibt es keinen anderen Weg, eine Instanz zu erzeugen.

Wenn du es dennoch machen willst: (deviceControl == deviceTest) müßte immer wahr sein.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2003, 11:41 Uhr
~singleton
Gast



Zitat:
ao postete
Die Instanz wird beim Programmstart angelegt und am Ende zerstört.


trifft auf obiges Beispiel nicht zu: Hier wird die Instanz erst beim ersten Aufruf der Funktion Control.getInstance erzeugt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.07.2003, 13:32 Uhr
ao

(Operator)



Zitat:
~singleton postete
trifft auf obiges Beispiel nicht zu: Hier wird die Instanz erst beim ersten Aufruf der Funktion Control.getInstance erzeugt.

Meinetwegen, aber das ist bedeutungslos. Sobald man die Instanz haben will, ist sie da. Wenn man sie danach noch mal anfordert, kriegt man dieselbe Instanz wieder.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.07.2003, 17:04 Uhr
~wissender
Gast


Falsch, singleton!
ALLE statischen Dinge sind zu Beginn festgelegt, auch private oder "lokale" (was sie nicht sind, es scheint nur so).
Hausaufgabe: Warum muss das so sein?
:-)
Hatte gerade mündliche Prüfung im Hardwarepraktikum, sorry...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.07.2003, 17:30 Uhr
~singleton
Gast


@wissender:

C++:
#include <iostream.h>


class A
{
public:
    A() { cout << "A::A" << endl; }
};


void foo()
{
    cout<<"foo() --->"<<endl;
    static A a;
}

void main()
{
    cout<<"main() --->"<<endl;
    static A a;
    foo();
}


Wenn das Stimmen würde was du sagst, dürfte Die ausgabe nicht so sein, wie sie ist.
Dein hardwarepratikum scheint nicht sonderlich doll zu sein, sorry... Ausserdem hat das glaube ich weniger wa mit hardware zu tun.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.07.2003, 17:33 Uhr
~0xdeadbeef
Gast


Ja, ha, ha. So hast du auch zwei verschiedene, statische Instanzen, natürich wird der Konstruktor zweimal ausgeführt. Probier mal das hier:

C++:
#include <iostream> //neuer Standard
using namespace std;

class A {
public:
    A() { cout << "A::A" << endl; }
};

void foo() {
    static A a;
    cout << "Test1" << endl;
}

int main() {
    foo();
    foo();
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.07.2003, 17:35 Uhr
~singleton
Gast


Die Ausgabe von meinem Programm ist bei mir:

Code:
main() --->
A::A
foo() --->
A::A


Das heisst also, daß das a in foo konstruiert wird, nachdem foo betreten wurde, nicht davor. Damit ist meiner Meinung nach die Aussage von wissender widerlegt, oder nicht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.07.2003, 17:50 Uhr
~0xdeadbeef
Gast


Soweit ich weiß, legt der Standard lediglich fest, bis wann, nicht wann genau, die statischen Objekte konstruiert werden müssen, dementsprechend ist die Ausgabe deines Programms compilerabhängig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.07.2003, 20:33 Uhr
virtual
Sexiest Bit alive
(Operator)


Was singleton sagt ist korrekt.
Es ist sogar noch extremer - es ist allein der Umgebende Block ausschlaggebend.

C++:
class Singleton
{
};


int main(int argc, char** argv)
{
   if (argc>1)
   {
       static Singleton s;
   }
   ...
}


Konstruiert s nur dann, wenn argc>1 ist.
In den meisten Fällen ist es - wie ao schon sagte - aber eher eine akademische Frage, wann das Singleton instantiiert wird, allerdings eben nur dann, wenn die Konstruktion der Instanz nicht irgendwelche bedeutsame Seiteneffekte hat.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: