2016-04-14 7 views
-2

ich die Instanzklasse zu einem Zeiger zuweisen versuchen, wie kann ich das tun:Wie assign „das“ Objekt zu einem statischen Klasse Zeiger

#include <fstream> 

using namespace std; 

class A 
{ 
    private: 
     static A *pointer; 

    protected: 

     A(){} 

     A GetInstance() 
     { 
      //On this point throw the error: could not convert A::pointer’ from A*’ to ‘A’ 
      pointer& = (A)this;   
      return pointer; 
     }  
}; 

A *A::pointer = NULL; 

Wie kann ich das tun?

static A *pointer; 
... 
... 
pointer& = (A)this;  

Ist es möglich? Ich versuche, eine einfache Repository-Klasse mit einer eindeutigen Verbindung instanziiert (nur einmal) und das Klassenrepository mit den Funktionen virtuals (Add, Save, GetById, GetAll()) erben von dieser Klasse, auf diese Weise könnte ich erstellen Viele Repository-Klassen verwenden nur die Verbindung, ohne jedes Mal zu öffnen und zu schließen. Wenn jemand ein Beispiel hat, würde ich mich freuen.

Danke in fortgeschrittenem.

+0

Nein, 'Zeiger & = (A) dies;' ist ungültig grammer. Was ist "weisen Sie die Instanzklasse einem Zeiger zu"? Meinst du '* pointer = * this;'? – MikeCAT

+3

Was ist mit der zusätzlichen Interpunktion und Casting? 'pointer = this;' - vielleicht sollten Sie einige bewährte Singleton-Implementierungen zuerst nachschlagen – BeyelerStudios

+1

@BeyelerStudios Die beste, industrietaugliche Singleton-Implementierung ist "tun Sie es nicht". Dieser Code hat einen schrecklichen Code-Geruch. –

Antwort

3

Es funktioniert nicht, wie Sie versucht haben, weil (A)this eine Konvertierung vom Typ ist A * (ein Zeiger auf ein Objekt der Klasse A) zu class A (ein Objekt der Klasse A). Der Compiler kann eine solche Konvertierung nicht durchführen.


Die Art der A::pointer ist A *. So ist this innerhalb der Methoden von class A.

Alles, was Sie brauchen, ist:

pointer = this; 

Oder, wenn Sie besser lesbar machen möchten, können Sie schreiben:

A::pointer = this; 

diese Weise ist es für einen Leser klar, dass pointer eine statische Eigenschaft ist (Klassenmitglied) und keine Instanzeigenschaft.


Sie haben einen Fehler in der nächsten Zeile. Der von A::getInstance() (return pointer;) zurückgegebene Wert stimmt nicht mit dem Typ überein, der im Header der Methode (ein Objekt der Klasse A) deklariert wurde. Der eine, der falsch ist, ist die Erklärung der Methode. Es macht wenig Sinn, ein Objekt vom Typ A zurückzugeben, es sollte einen Zeiger auf ein solches Objekt (genauer gesagt die einzige Instanz der Klasse, die in A::pointer gespeichert ist.

) Ändern Sie die Definition der Methode wie folgt:

A *GetInstance() 
{ 
    pointer = this; 
    return pointer; 
} 

Wie andere Leser bereits in den Kommentaren bemerkt haben, es scheint, dass Sie die Singleton pattern zu implementieren versuchen (aber Sie sind nur auf halbem Weg durch sie). Der beste Rat über Singleton ist es, weil es zu vermeiden ist nicht testbar, sondern nur eine getarnte globale Variable und globale Variablen sind im Allgemeinen eine schlechte Möglichkeit, Ihre Daten zu speichern.

+0

Danke, ich werde das besser lesen. – Vitorlui

Verwandte Themen