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

1

08.11.2013, 15:19

[GELÖST] Problem beim Speichern und Laden mit Hilfe einer Template-Klasse (C++, SDL)

Hallo zusammen,
ich habe Heiko Kalistas Buch durch und bin dabei das Spiel am Ende des Buchs zu erweitern.
Nun wollte ich mir eine Template-Klasse erstellen, um mir das Speichern und Laden zu vereinfachen und den Quellcode übersichtlicher zu halten.
Das Kompilieren klappt soweit auch fast, nur beim Verknüpfen kommt jedes mal der Fehler:

Dieser Moment, wenn du einen Beitrag gepostet hast und du merkst, dass mit "Eingabe" in der Forumüberschrift nicht die Ein- und Ausgabe bei Dateien gemeint ist :dash:

1>Verknüpfen...
1>Menu.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: void __thiscall CSave<int>::Load(int *,char * const)" (?Load@?$CSave@H@@QAEXPAHQAD@Z)".
1>Score.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: void __thiscall CSave<int>::Save(int const *,char * const)" (?Save@?$CSave@H@@QAEXPBHQAD@Z)".
1>C:\Users\Oskar\Desktop\Programmieren\Source\Kapitel 12\SDL_Game\Release\SDL_Game.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.


Und hier noch einmal die Stellen im Quellcode wo der Fehler sitzen könnte:

Die Save.hpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef SAVE_HPP
#define SAVE_HPP

#include <fstream>
#include <iostream>
#include "Singleton.hpp"

using namespace std;

template<class T>
class CSave
{
public:
    void Save(const T *pData, char Filename[]);
    void Load(T *pData, char Filename[]);
};

#endif


Die Save.cpp:

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
27
#include "Save.hpp"

template <class T>
void CSave<T>::Save(const T *pData, char Filename[])
{
    ofstream Output((char *) Filename, ios::binary);
    if (Output != NULL)
    {
        Output.write((char *) pData, sizeof (*pData));
        Output.close();
    }
    else
        cout << "Fehler beim Speichern von: " << Filename << endl;
}

template <class T>
void CSave<T>::Load(T *pData, char Filename[])
{   
    ifstream Input((char *)Filename, ios::binary);
    if (Input != NULL)
    {
        Input.read((char *) pData, sizeof (*pData));
        Input.close();
    }
    else
        cout << "Fehler beim Laden von: " << Filename << endl;
}


Ein Beispiel wie ich die Funktion aufrufe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void CScore::Save()
{
    CSave<int> Save;
    int Score = m_Score + m_Bonus;
    int Highscore = 0;
    Save.Load(&Highscore, "Data/Highscore.hsc");

    if (Score > Highscore)
    {
        Save.Save(&Score, "Data/Highscore.hsc");
    }
}


Vielen Dank schon einmal im voraus :)
zombiepicman

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »zombiepicman« (08.11.2013, 15:57)


2

08.11.2013, 15:25

Deklaration und Definition von Templates müssen in einer Übersetzungseinheit vorliegen. In der Regel inkludiert man die Definition am Ende der Header-Datei.

Als Dateiendung wählt man in der Regel .inl

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

3

08.11.2013, 15:31

Tut mir leid, dass ich frage, aber ich weiß nicht genau was du damit meinst, könntest du ein winziges Codebeispiel schreiben? :)
Ich habe wie gesagt erst seit ein paar Tagen das Buch durch..

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

08.11.2013, 15:49

Du benennst die .cpp in .inl um und bindest sie im Header nach der Klassendefinition ein.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

08.11.2013, 15:56

Danke :)
So funktioniert's!

Werbeanzeige