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

25.01.2011, 08:02

Mein kleines Projekt -> warum foldene Fehler?

Hallo-hallo,

ich hab mir ein kleines Projekt vorgenommen, ich möchte ein 3D Remi Spiel (rumänisch) erstellen.

Habe gerade angefangen die Klassen auszuarbeiten, deswegen ist es noch ein Konsolenprojekt, damit ich vorerst bissle testen kann was ich code (bin total aus der Übung, muss mich erst wieder an alles erinnern :D).

hier mal Code bis dato:

main.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
#include <iostream>
#include "classes.h"

int main()
{
    Steine::Init(106,
        "r101","r102","r103","r104","r105","r106","r107","r108","r109","r110","r112","r113",
        "r201","r202","r203","r204","r105","r106","r107","r108","r109","r110","r212","r213",
        "s101","s102","s103","s104","s105","s106","s107","s108","s109","s110","s112","s113",
        "s201","s202","s203","s204","s105","s106","s107","s108","s109","s110","s212","s213",
        "g101","g102","g103","g104","g105","g106","g107","g108","g109","g110","g112","g113",
        "g201","g202","g203","g204","g105","g106","g107","g108","g109","g110","g212","g213",
        "b101","b102","b103","b104","b105","b106","b107","b108","b109","b110","b112","b113",
        "b201","b202","b203","b204","b105","b106","b107","b108","b109","b110","b212","b213",
        "r1j1","s1j1"
        );

    std::cout << Steine::m_Steinliste.size();

    return 1;
}


classes.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
27
// Klasse für einen Stein
class Stein
{
private:
    // Membervariablen
    string  m_sName;

public:
    // Memberfunktionen
    Stein(string sName);
    ~Stein() {};
    string  m_getName();
    char    m_getColor();
    string  m_getValue();
};

// Alle Steine in einer Liste
class Steine
{
public:
    // Membervariablen
    static vector<Stein *> m_Steinliste;

    // Memberfunktionen
    static void Init(int nCount, ...);
    static void Down();
};


classes.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "classes.h"

vector<Stein *> m_Steinliste;

// Stein
Stein::Stein(string sName)
{
    m_sName = sName;
}

string Stein::m_getName()
{
    return m_sName;
}

char Stein::m_getColor()
{
    return m_sName.at(0);
}

string Stein::m_getValue()
{
    return m_sName.substr(1,2);
}

// Steine
void Steine::Init(int nCount, ...)
{
    va_list Parameters;
    va_start(Parameters, nCount);

    for(int i = 0; i < nCount; i++)
    {

        m_Steinliste.push_back(new Stein(va_arg(Parameters, string)));
    }

    va_end(Parameters);
}

void Steine::Down()
{
    for(int i = 0; i < m_Steinliste.size(); i++)
    {
        delete m_Steinliste[i];
    }
}



Ja ich weiß, man könnte es sicher auch anders machen, wie bei fast allem, aber in erster Linie interessiert mich jetzt warum es so, wie ich es jetzt realisiert hab folgende Fehler erzeugt:

classes.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class std::vector<class Stein *,class std::allocator<class Stein *> > Steine::m_Steinliste" (?m_Steinliste@Steine@@2V?$vector@PAVStein@@V?$allocator@PAVStein@@@std@@@std@@A)".
1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class std::vector<class Stein *,class std::allocator<class Stein *> > Steine::m_Steinliste" (?m_Steinliste@Steine@@2V?$vector@PAVStein@@V?$allocator@PAVStein@@@std@@@std@@A)".
1>classes.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Stein::~Stein(void)" (??1Stein@@QAE@XZ)" in Funktion ""public: void * __thiscall Stein::`scalar deleting destructor'(unsigned int)" (??_GStein@@QAEPAXI@Z)".
1>c:\users\cmb\documents\visual studio 2010\Projects\Remmi_v1.01\Debug\Remmi_v1.01.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.

Danach kömma dann über andere Umsetzungsmöglichkeiten reden! xD

Ich sag mal danke im voraus.


Edit by dot: Codetags angepasst

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Cyborg« (25.01.2011, 20:57)


DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

2

25.01.2011, 09:52

Der Inhalt von classes.h sieht genauso aus wie classes.cpp.

Du hast den Destruktor vermutlich deklariert aber nicht definiert.

Und was diese m_Steinliste angeht, kann ich grade nur raten, diese ist statisch deklariert in der Header Datei? Wenn ja dann musst du sowas wie:

static std::vector<Stein*> Stein::m_SteinListe;

in deine Cpp Datei schreiben.

Ich bin mir allerdings nicht ganz sicher ob das static dann noch dazu gehört, ist schon eine Weile her als ich dies das letzte mal verwendet habe.

mfg Mark

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

25.01.2011, 10:14

Wie DerMark schon sagte, du hast offenbar vergessen m_SteinListe und den Destruktor von Stein zu definieren. Bei der Definition allerdings kein static hinschreiben.

4

25.01.2011, 19:13

Danke für eure Antworten!

War natürlich sehr sinnig, dass ich 2 mal die classes.h reinkopiert hab, muss mir heute morgen in der Eile passiert sein...

Imo bin ich noch im Büro, denke ich bin so gegen 8 daheim, dann werd ich meinen ersten Post korrigieren, es wäre nett wenn ihr dann nochmal drüberschauen würdet.

Auf jeden Fall schonmal danke.

5

25.01.2011, 20:32

So, Code ist jetzt der richtige, es war zwei mal der code der classes.cpp, jetzt ist auch die .h up.

Okay ein Fehler is schonmal weg, ich hatte tatsächlich den Dekonstruktor von Stein nicht definiert.

Auf mehr bin ich bis jetzt noch nicht gekommen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

25.01.2011, 20:36

Naja, wie gesagt musst du auch noch m_Steinliste definieren.

C-/C++-Quelltext

1
std::vector<Stein*> Stein::m_SteinListe;

irgendwo oben (nach dem #include) in deine classes.cpp packen...

7

25.01.2011, 21:00

So, hab es aktualisiert (auch den Code oben) hab jetzt einfach in die *.cpp, so wie du es gesagt hast, oben noch "vector<Stein *> m_Steinliste;" unter include hinzugefügt, trotzdem noch die beiden Fehler:

classes.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class std::vector<class Stein *,class std::allocator<class Stein *> > Steine::m_Steinliste" (?m_Steinliste@Steine@@2V?$vector@PAVStein@@V?$allocator@PAVStein@@@std@@@std@@A)".

main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class std::vector<class Stein *,class std::allocator<class Stein *> > Steine::m_Steinliste" (?m_Steinliste@Steine@@2V?$vector@PAVStein@@V?$allocator@PAVStein@@@std@@@std@@A)".

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.01.2011, 21:04

Du hast auch was wesentliches vergessen ;)
Das was du da jetzt stehen hast definiert jedenfalls nur eine globale Variable vom Typ std::Vector<Stein*> mit Namen m_Steinliste...

9

25.01.2011, 21:17

Tut mir leid, ich blicks einfach nicht... -_-

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

25.01.2011, 21:18

Schau nochmal genau was der Unterschied zwischen dem was ich geschrieben hab und dem was du geschrieben hast is:

C-/C++-Quelltext

1
std::vector<Stein*> Stein::m_SteinListe;

;)

Werbeanzeige