Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

1

11.01.2013, 18:37

Problem mit Linker!

Hallo!
Ich habe ein kleines Problem und zwar habe ich folgenden Code geschrieben und möchte ihn gerne ausführen:

main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "ScreenManager.h"

using namespace std;

int main()
{
    ScreenManager::GetInstance().setText("ScreenManager: testing...");
    ScreenManager::GetInstance().drawText();

    cin.get();
    return 0;
}


ScreenManager.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef SCREENMANAGER_H
#define SCREENMANAGER_H

#include <iostream>
#include <string>

using namespace std;

class ScreenManager
{
    private:
        ScreenManager();
        ScreenManager(ScreenManager const&);
        void operator = (ScreenManager const&);

        string text;

    public:
        ~ScreenManager();
        static ScreenManager &GetInstance();
        
        void setText(string text);
        void drawText();
};

#endif


ScreenManager.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "ScreenManager.h"

ScreenManager &ScreenManager::GetInstance()
{
    static ScreenManager instance;
    return instance;
}

void ScreenManager::setText(string text)
{
    this->text = text;
}

void ScreenManager::drawText()
{
    cout << text << endl;
}


Es erscheint jedoch folgender Fehler, der mir wohl sagt, dass ich irgendetwas vergessen habe zu verlinken. Nur weiß ich nicht, was das sein soll? Gehört nicht alles, was ich gemacht habe sowieso zum Standardlinker?

Fehler:

Quellcode

1
2
3
4
5
6
1>------ Erstellen gestartet: Projekt: sfml_platformer, Konfiguration: Debug Win32 ------
1>  ScreenManager.cpp
1>ScreenManager.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""private: __thiscall ScreenManager::ScreenManager(void)" (??0ScreenManager@@AAE@XZ)" in Funktion ""public: static class ScreenManager & __cdecl ScreenManager::GetInstance(void)" (?GetInstance@ScreenManager@@SAAAV1@XZ)".
1>ScreenManager.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall ScreenManager::~ScreenManager(void)" (??1ScreenManager@@QAE@XZ)" in Funktion ""void __cdecl `public: static class GetInstance & __cdecl ScreenManager::GetInstance(void)'::`2'::`dynamic atexit destructor for 'instance''(void)" (??__Finstance@?1??GetInstance@ScreenManager@@SAAAV1@XZ@YAXXZ)".
1>C:\Users\Luca\Documents\Visual Studio 2010\Projects\sfml_platformer\Debug\sfml_platformer.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

FSA

Community-Fossil

  • Private Nachricht senden

2

11.01.2013, 18:40

Du hast zwar Konstruktor und Destruktor deklariert aber nicht definiert. Da du sie sowieso nicht definiert hast, löschen folgende Zeilen aus ScreenManager.h:

C-/C++-Quelltext

1
2
3
 ScreenManager();
~ScreenManager();
ScreenManager(ScreenManager const&);

http://msdn.microsoft.com/de-de/library/…z(v=vs.80).aspx

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

11.01.2013, 18:55

Luca, lies doch bitte die Fehlermeldungen.
Da steht doch ganz klar:
private: __thiscall ScreenManager::ScreenManager(void)
public: __thiscall ScreenManager::~ScreenManager(void)

Die "GetInstance"-Methode solltest Du übrigens schleunigst wegschmeißen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

4

12.01.2013, 13:15

Du hast zwar Konstruktor und Destruktor deklariert aber nicht definiert. Da du sie sowieso nicht definiert hast, löschen folgende Zeilen aus ScreenManager.h

Er hat diese Konstruktoren ja als private definiert. In sofern, ist es keine Lösung einfach diese Zeilen zu löschen.

Luca: Du scheinst hier ein Singleton-Pattern verwirklichen zu wollen. Und du solltest dir gut Überlegen, ob du das wirklich willst. Denn in der Regel kann man das Singleton-Pattern nur an der falschen Stelle verwenden ;). Daher ist meine Empfehlung, auf Singleton zu verzichten und den Default-Konstruktor public zu machen(du musst ihn dann aber noch definieren(also eine Funktionsrumpf mit geschweiften Klammern für den Konstruktor und Destruktor schreiben). Je nach Funktionsweise deiner Klasse und ob du Kopien und Zuweisungen erlauben willst, können Copy-Konstruktor und Zuweisungsoperator jedoch private und undefiniert bleiben. Der Destruktor muss dann aber natürlich auch public sein(und definiert werden).

FSA

Community-Fossil

  • Private Nachricht senden

5

12.01.2013, 13:44

@Fred: Doch es ist eine Lösung. Singleton sollte man so oder so nicht verwenden(außer in extremen Ausnahmen). Wenn man Singleton benutzt ist es nach meiner Beurteilung Faulheit.

Aber ok ich korrigiere: Definiere bitte auch Konstruktor/Destruktor in der ScreenManager.cpp

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige