2009-08-05 9 views
1

Entschuldigung für die Umbuchung, aber aus irgendeinem Grund kann ich keine Kommentare zu meinem älteren Beitrag hinzufügen. Einige Leute wollten die genaue Fehlermeldung wissen, die ich bekomme, wenn ich versuche, Folgendes zu tun:OO Programmierung Design-Frage: Globales Objekt Teil II

Ich habe wahrscheinlich ein recht einfaches Problem, aber ich fand keine richtige Design-Entscheidung noch. Grundsätzlich habe ich 4 vererbte Klassen und jede dieser Klassen hat mehr als 10 Methoden.

Jede dieser Klassen sollte den gleichen TCP-Socket verwenden; Dieses Objekt hält einen Socket während der Programmausführung für den Server offen. Meine Idee war es, die TCP haben obejct als „global“ erklärt, so dass alle anderen Klassen können es verwenden:

classTCP TCPSocket; 

class classA 
{ 
private: 
public: 
classA(); 
virtual void method1(); 
... 

}; 

class classB 
{ 
private: 
public: 
classB(); 
virtual void method1(); 
    ... 

}; 

und so weiter für Klasse C und KlasseD ...

Leider, wenn es erklärt so gibt mir mein Symbian GCC-E Compiler die folgende Fehlermeldung

Elf2e32: Fehler: E1027: ELF-Datei enthält initialisierte beschreibbare Daten.

Also frage ich mich, ob es eine andere Möglichkeit gibt, wie ich dieses TCP-Objekt zu deklarieren, so dass es für alle anderen Klassen und seine Methoden verfügbar ist? classA() ist die erste Methode, die aufgerufen wird, wenn dieses Subsystem initialisiert wird.

Vielen Dank!

+0

Sie haben nicht genug Rep zu kommentieren, aber Sie können IMMER eine Frage bearbeiten, und das sollten Sie in diesem Fall getan haben. –

+0

Leider muss ich zuerst einen Account dafür bekommen. Wenn ich als Gast posten kann, kann ich nicht von einem anderen Rechner aus arbeiten. –

Antwort

-1
+0

Beachten Sie, dass es standardmäßig nicht threadsicher ist. – nagul

+0

und dass es den spaßigen Nebeneffekt hat, zu verhindern, dass du jemals mehr als eine Steckdose erzeugst, woran ich zweifle, dass er daran interessiert ist. Sprich nach mir: "Singletons sind kein Drop-In-Ersatz für Globals". – jalf

+0

@jalf: Ich bin mir nicht sicher, ob ich Ihren Standpunkt verstehe. Singletons verhindern nicht, dass Sie mehr als ein Objekt haben. Zum Beispiel SocketManager.createNewSocket() ... –

1

Es gibt eine sehr elegante Möglichkeit, statische Instanzen bei Bedarf abzurufen.

classTCP& SingletonInstance() 
{ 
    static classTCP instance; 
    return instance; 
} 

Idea verwendet C++ - Funktion, um lokale statische Variablen nur bei Bedarf zu initialisieren.

+0

Das einzige Problem, auf das man achten sollte, sind potentielle Race Conditions, wenn die Funktion zum ersten Mal aufgerufen wird, und zwei Threads versuchen, Ihre classTCP gleichzeitig zu initialisieren. – jalf

+0

kein Problem mit volatilen Schlüsselwort. – Dewfy

0

Sie können ein statisches Member für die gesamte Klasse unterstützen, indem Sie zulassen, dass sowohl Klasse A als auch Klasse B von demselben übergeordneten Element erben.

class BaseTCP { 
    static classTCP tcp; 
    // ... 
}; 

class classA : BaseTCP { 
    // ... 
}; 

class classB : BaseTCP { 
    // ... 
}; 

Jetzt haben Klasse A und Klasse B das gleiche statische Element. Die Bedingung ist, dass Sie jetzt das statische Element, das außerhalb der BaseTCP Klasse irgendwo in ähnlicher Weise zu erklären haben:

classTCP BaseTCP::tcp; 

Je nach Situation, diese Overkill ...

sein kann
0

Statt Singletons zu verwenden, Warum erstellen Sie nicht einfach eine classTCP-Instanz und übergeben Referenzen an die anderen Objekte, von denen jedes einen Verweis (oder Zeiger) auf die einzelne Instanz von classTCP besitzt.

Dies bietet eine viel flexiblere Gestaltung - ich denke, Singletons im Allgemeinen saugen und haben viel mehr begrenzte Verwendung, die allgemein geglaubt wird. Wenn Sie einen Singleton verwenden, haben Ihre Klassen classA, classB etc ... keine andere Möglichkeit, als die Singleton-Instanz zu verwenden. Indem Sie ein mehr standardmäßiges Objektkompositionsdesign verwenden, befreien Sie das Ganze.

Stellen Sie sich Fragen, wie, wenn ich möchte, dass die Anwendung mit> 1 Server spricht?oder was, wenn ich einen Unit-Test-Code für Klasse A schreiben möchte? Der Schreibgeräte-Testcode für Netzwerkanwendungen ist viel einfacher, wenn Sie keine echten Sockets verwenden müssen, sondern Dummy-Codes, die einfach die Datenblöcke im RAM enthalten. Fügen Sie einen Kommentar hinzu, wenn Sie ein Beispiel wollen, weil ich jetzt zum Mittagessen bin :)

Doing es die Weise, die ich vorschlagen, fügt bedeutender Kompliziertheit nicht zum Gesamtentwurf hinzu, aber macht es viel offener.

Verwandte Themen