2 Stimmen

OO Programmierung Frage: Globales Objekt

Ich habe wahrscheinlich ein ganz einfaches Problem, aber ich habe noch keine richtige Designentscheidung gefunden. Im Grunde habe ich 4 verschiedene Klassen und jede dieser Klassen hat mehr als 10 Methoden.

Jede dieser Klassen sollte denselben TCP-Socket verwenden; dieses Objekt hält während der gesamten Programmausführung einen Socket zum Server offen. Meine Idee war, das TCP-Objekt als "global" zu deklarieren, damit alle anderen Klassen es verwenden können:

classTCP TCPSocket;

class classA  
{  
    private:   
    public:   
    classA();  
    ...   
};    

class classB  
{  
    private:   
    public:   
    classB();  
    ...   
};    

Leider, wenn es so deklariert mein C++-Compiler gibt mir eine Fehlermeldung, dass einige initialisierte Daten in der ausführbaren Datei geschrieben wird (???). Ich frage mich also, ob es eine andere Möglichkeit gibt, dieses TCP-Objekt so zu deklarieren, dass es für ALLE anderen Klassen und ihre Methoden verfügbar ist?

Vielen Dank!

0voto

AProgrammer Punkte 49452

Wenn Sie ein Objekt haben, das in Ihrem Programm einzigartig ist und an vielen Stellen verwendet wird, haben Sie mehrere Möglichkeiten:

  • überall einen Verweis auf das Objekt übergeben

  • ein mehr oder weniger gut verstecktes Global verwenden (Singleton, Mono-State, ...)

Jeder Ansatz hat seine Nachteile. Sie sind ziemlich gut kommentiert und einige haben sehr starke Meinungen zu diesen Themen (suchen Sie nach "singleton anti-pattern"). Ich werde nur einige von ihnen geben, und nicht versuchen, vollständig zu sein.

  • Die Weitergabe eines Verweises ist mühsam und wirft den Code durcheinander; also behält man diese Verweise in einem langlebigen Objekt, um die Anzahl der Parameter zu verringern. Wenn der Zeitpunkt kommt, an dem das "einzigartige" Objekt nicht mehr einzigartig ist, sind Sie dann bereit? Nein: Sie haben mehrere Pfade zu dem eindeutigen Objekt und werden feststellen, dass sie sich nun auf verschiedene Objekte beziehen und inkonsistent verwendet werden. Die Fehlersuche kann ein Alptraum sein, schlimmer noch als die Änderung des Codes von einem globalen Ansatz zu einem weitergegebenen Ansatz, und das Schlimmste war in den Zeitplänen nicht eingeplant, als der Code fertig war.

  • globale Probleme wie das der Annäherung sind sogar noch bekannter. Sie führen versteckte Abhängigkeiten ein (so dass die Wiederverwendung von Komponenten schwieriger ist), unerwartete Nebeneffekte (es ist schwieriger, das richtige Verhalten zu erreichen, die Behebung eines Fehlers irgendwo löst einen Fehler in einer anderen Komponente aus), das Testen ist komplizierter, ...

In Ihrem Fall ist der Besitz einer Steckdose an sich nichts Besonderes. Die Wahrscheinlichkeit, dass Sie einen anderen Sockel in Ihrem Programm verwenden oder die Komponenten irgendwo wiederverwenden müssen, wo dieser Sockel nicht mehr einzigartig ist, scheint ziemlich hoch zu sein. Ich würde mich nicht für einen globalen Ansatz entscheiden, sondern für einen parametrisierten. Beachten Sie, dass, wenn Ihr Socket an sich einzigartig ist - wie z.B. bei der Protokollierung über das Netzwerk - Sie ihn besser in einem Objekt kapseln sollten, das für diesen Zweck entwickelt wurde. Zum Beispiel Logging. Und dann könnte es Sinn machen, eine globale Funktion zu verwenden.

0voto

Tom Dalling Punkte 22462

Wie bereits erwähnt wurde, sind Globals schlecht usw.

Aber um den Kompilierfehler zu beheben, den Sie haben, bin ich mir ziemlich sicher, dass es daran liegt, dass Sie die Global in einer Header-Datei definieren, die in mehreren Dateien enthalten ist. Was Sie wollen, ist dies:

etwas.h

extern classTCP TCPSocket; //global is DECLARED here

class classA  
{  
    private:   
    public:   
    classA();  
    ...   
};

etwas.cpp

classTCP TCPSocket; //global is DEFINED here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X