2017-01-29 2 views
0

Ich habe nach ~ 30-45 Minuten gesucht und habe nach Tippfehlern usw. gesucht. Dies ist mein erstes Mal in C++ nach einer langen Zeit Codierung, so dass die Syntax ein wenig schwer zu nehmen ist. Ich mache gerade die Basisklassen für mein Projekt und so ist der Code im Moment wirklich einfach.Undefiniert Referenz auf Klasse

Server.h

/* 
* Server.h 
* 
* Created on: Jan 28, 2017 
*  Author: Jon 
*/ 

#ifndef SERVER_H_ 
#define SERVER_H_ 

class Server { 
public: 
    Server(); 
    virtual ~Server(); 
    static Server* getInstance(); 

private: 
    static Server* instance; 
}; 


#endif /* SERVER_H_ */ 

Server.cpp

/* 
* Server.cpp 
* 
* Created on: Jan 28, 2017 
*  Author: Jon 
*/ 

#include "Server.h" 

Server::Server() { 
    // TODO Auto-generated constructor stub 

} 

Server::~Server() { 
    // TODO Auto-generated destructor stub 
} 

Server* Server::getInstance() { 
    if (!Server::instance) 
     Server::instance = new Server(); 
    return Server::instance; 
} 

Einheit Test Klasse

#include <iostream> 
#include "Server.h" 
#include <assert.h> 

Server* server; 

int main() { 
    server = Server::getInstance(); 
    return 0; 
} 

Ich bin derzeit r unning in ein Problem mit ...

Undefined Verweis auf Server :: Instanz

Ist, wie ich mein statisches Element falsch zugreifen?

+0

hinzufügen Ihre Frage wird für zukünftige Leser bedeutungslos sein, wenn es sich ändert, besonders nachdem Benutzer es beantwortet haben. – drescherjm

+0

Warum geben Sie einen Zeiger und keine Referenz zurück? –

+0

@ChristianHackl Sorry, ich code nicht viel in C++. Was würde sich ändern, wenn ich es durch Bezugnahme tun würde? –

Antwort

2

getInstance ist eine statische Member-Funktion der Klasse Server, die auf den Namespace gehört Server, so dass Sie es in main() als verwenden sollten:

instance = Server::Server::getInstance(); 
//   ~~~~~~~~ 

Und Sie sollten die Definition ändern von Server::instance innerhalb Namespace Server von

Server* instance;   // a non-member variable in namespace Server 

zu

Server* Server::instance; // the definition of the static member variable Server::instance 

EDIT

Nach dem Bearbeiten (Entfernen des Namespace) die ursprüngliche Nutzung jetzt korrekt ist. Das einzige Problem ist die Definition des statischen Elements Server::instance. Sie sollten es in der Server.cpp als

Server* Server::instance; // the definition of the static member variable Server::instance 
+0

Autsch, ich habe gerade herausgefunden, dass Eclipse diese Namespaces bei der Klassenerstellung erstellt hat. Ich habe die Namespaces jetzt entfernt. Ist der ursprüngliche Weg richtig? –

+0

@ JonathanNguyen Wenn Sie den Namespace nicht benötigen und ihn entfernen, ist die ursprüngliche Verwendung korrekt. Beachten Sie, dass Sie auch anderen relevanten Code korrigieren müssen. – songyuanyao

+0

Du bist erstaunlich. Danke für die geduldige Hilfe. Es ist ein peinlicher Übergang von Java! –

0

Sie nicht Server::getInstance() initialisiert:

Wechsel:

Server* getInstance() { 

An:

Server* Server::getInstance() { 

@songyuanyao ist richtig, Server::getInstance() statisch ist, und Server ist im Server Namespace. So rufen getInstance() Verwendung:

Server::Server::getInstance() 
+0

Ich habe immer noch das gleiche Problem + 1 mehr. –