2016-07-14 41 views
-1

Ich versuche, eine Server-Schnittstelle zu verwenden, um mehrere Server abhängig davon zu verwalten, welche verfügbar ist. Vereinfacht ist der Code wie folgt aus:Kann 'Objekt *' nicht in 'Zusammenfassung *' in der Initialisierung konvertieren

Server.h

class Server : public ServerInterface { 
public: 
    Server(); 
    static Server * getServerPtr(); 
} 

Server.cpp

#include "Server.h" 

Server::Server() {} 

Server * Server::getServerPtr() { 
    Server * server = new Server(); 
    return server; 
} 

HMDServer.h

class HMDServer : public ServerInterface { 
public: 
    HMDServer(); 

    static HMDServer * getHMDServerPtr(); 

    void init(); 

private: 
    int server_type; 

HMDServer.cpp

#include "HMDServer.h" 

HMDServer::HMDServer() { 
    server_type = 1; 
    init(); 
} 

HMDServer * HMDServer::returnHMDServerPtr() { 
    HMDServer * server = new HMDServer(); 
    return server; 
} 

void HMDServer::init() { 
    //try to initialize server 
    server_type = 111; // if initialization successful 
} 

ServerInterface.h

class ServerInterface { 
public: 
    static ServerInterface * getServer(); 
} 

ServerInterface.cpp

#include "ServerInterface.h" 
#include "HMDServer.cpp" 
#include "Server.cpp" 

ServerInterface * ServerInterface::getServer() { 
    ServerInterface * server1 = HMDServer::getHMDServerPtr(); //This works perfectly 
    if(server1->getServerType() == 1) { 
     ServerInterface * server2 = Server::getServerPtr(); 
     return server2; 
    } else 
     return server1; 
} 

main.cpp

#include "ServerInterface.cpp" 

int main() { 

    ServerInterface * server = ServerInterface::getServer(); 

    return 0; 
} 

Wenn ich diesen Code ausführen, geht es im Inneren GetServer() 's, wenn die Funktion und Wenn es versucht, einen Zeiger von der Server-Klasse zu erhalten, erhalte ich eine Fehlermeldung: cannot convert 'Server*' to 'ServerInterface*' in initialization. Pre Bevor ich die Server-Dateien hinzugefügt habe und nur HMDServer enthalten war, funktionierte es einwandfrei. Was habe ich falsch gemacht?

+0

Ist nicht 'ServerInterface * getServer()' in Ihrer Datei ServerInterface.cpp 'ServerInterface * ServerInterface :: getServer()'? Sie scheinen den Klassennamen in Ihrer Implementierung weggelassen zu haben. Darüber hinaus wird 'HMDServer * getHMDServerPtr()' als nicht statisch deklariert, dennoch rufen Sie es auf, als wäre es statisch und die Implementierung fehlt vollständig in Ihrem Post. ** Post echten Code **. – WhozCraig

+0

Bitte ** ** vollständigen ** Code anzeigen. Wie kennt ServerInterface.cpp Server? –

+0

Danke WhozCraig für deine Antwort, das war schon in meinem eigentlichen Code implementiert, ich habe nur vergessen, es hier aufzunehmen. Ich kann den gesamten Code nicht veröffentlichen, es sei denn, Sie möchten 50 verschiedene Funktionen betrachten, die die Server-Objekte tun, die für die Konstruktion des Objekts irrelevant sind, wie getTime() usw. Die relevanten Funktionen sind hier und ich habe hinzugefügt #include Dateien und main.cpp zusammen mit den Korrekturen, auf die Sie hingewiesen haben. – IntiM

Antwort

0

Nicht sicher, ob dies ein Tippfehler ist oder tatsächlich in Ihrem Code, aber in Ihrem ServerInterface.cpp, geben Sie Folgendes:

#include "HMDServer.cpp" 
#include "Server.cpp" 

Wenn Sie wirklich .cpp Dateien statt die tatsächlichen Header, seltsames Verhalten enthalten ist erwartet werden. Das Gleiche gilt für

#include "ServerInterface.cpp" 

in Ihrem main.cpp.