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!

9voto

Michael Myers Punkte 183216

Ich würde vorschlagen, dass Sie die Instanz in Ihrem Initialisierungscode behalten und sie an jede der Klassen weitergeben, die sie benötigt. Auf diese Weise ist es viel einfacher, eine Mock-Implementierung zum Testen zu ersetzen.

4voto

scheibk Punkte 1370

Das klingt nach einem Job für die Singleton Entwurfsmuster.

4voto

Die mich klingt mehr für den richtigen Zeitpunkt, um Dependency Injection zu verwenden, wie ich neige dazu, Singleton so viel wie ich kann zu vermeiden (Singleton sind nur ein weiterer Weg für den Zugriff auf GLOBLAS, und seine etwas zu vermeiden)

Singleton vs. Dependency Injection wurde bereits auf SO diskutiert, siehe Tag "dependency injection" (sorry, dass ich keine Links posten kann, aber SO erlaubt mir als neuem Benutzer nicht, mehr als einen Link zu posten)

Wikipedia: Dependency Injection

Wie in Ihrem aktuellen Code-Beispiel, sollte geändert werden, um die Injektion der Socket auf den Konstruktor der einzelnen Klasse zu ermöglichen:

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

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

1voto

Mark Roddy Punkte 25266

Übergeben Sie den Socket an den Konstruktor jedes Objekts. Dann erstellen Sie eine separate Fabrikklasse der sie erstellt und den entsprechenden Socket einfügt. Jeder Code, der den Satz von Objekten verwendet, die denselben Socket haben müssen, sollte sie dann über eine Instanz dieses Fabrikobjekts erstellen. Dies entkoppelt die Klassen, die einen einzigen Socket verwenden sollen, und ermöglicht gleichzeitig die Durchsetzung der Shared-Socket-Regel.

0voto

Ben Doerr Punkte 1615

Der beste Weg, dies zu tun, ist mit einem Singleton. Hier ist seine Implementierung in Java

Singleton-Klasse:

public class SingletonTCPSocket {
  private SingletonTCPSocket() {
    // Private Constructor
  }

  private static class SingletonTCPSocketHolder { 
    private static final SingletonTCPSocket INSTANCE = new SingletonTCPSocket ();
  }

  public static SingletonTCPSocket getInstance() {
    return SingletonTCPSocket.INSTANCE;
  }

  // Your Socket Specific Code Here
  private TCPSocket mySocket;
  public void OpenSocket();
}

Die Klasse, die das Socket benötigt:

public class ClassA {
  public ClassA {
    SingletonTCPSocket.getInstance().OpenSocket();  
  }  
}

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