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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

07.09.2013, 19:14

[c++] static vector

Hallo Community,
ich habe seit einiger Zeit Probleme mit einem

C-/C++-Quelltext

1
static vector
und wollte fragen ob mir vieleicht einer weiter helfen kann.
Die Klasse Time

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
class TimeClass
{
private:
    struct TimeMember
    {
        TimeMember ();
        TimeMember (unsigned int MemberID, double Time);
        TimeMember (const TimeMember&);
        ~TimeMember ();

        unsigned int MemberID;
        double TimeStart;
        double Time;
    };

public:
    TimeClass(void);
    ~TimeClass(void);

    static double Time_in_sec (double Time);
    static unsigned int NewTimeMember ();
    static void DeletTimeMember (unsigned int TimeMember);
    static double GetTime ();

    static void SetTime (double Time, unsigned int TimeMember);
    static void SetTimeNULL (unsigned int TimeMember);
    static double MyTime (unsigned int TimeMember);

private:
    static void NewTime (double& Time);
    static std::vector <TimeMember*> Member;
};


Beim starten bekomme ich leider diese Fehlermeldung mit der ihc nichts anfangen kann

Quellcode

1
timeclass.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static class std::vector<struct TimeClass::TimeMemberInfo *,class std::allocator<struct TimeClass::TimeMemberInfo *> > TimeClass::Member" (?Member@TimeClass@@0V?$vector@PAUTimeMemberInfo@TimeClass@@V?$allocator@PAUTimeMemberInfo@TimeClass@@@std@@@std@@A)".


Ich würde mich sehr über eine Antwort freuen

2

07.09.2013, 19:29

Du musst statische Member erst initialisieren:

C-/C++-Quelltext

1
std::vector<TimeMember*> TimeClass::Member;

Das kannst du so hinter die Klassendeklaration schreiben.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

07.09.2013, 19:57

Du musst statische Member erst initialisieren:

C-/C++-Quelltext

1
std::vector<TimeMember*> TimeClass::Member;

Das kannst du so hinter die Klassendeklaration schreiben.

Genaugenommen heißt es definieren und das wird so nur funktionieren, solange er den Header nur in einer einzigen .cpp Datei inkludiert, sonst wird der vector mehrfach definiert, was wiederum ebenfalls zu einem Linkerfehler führt. Besser: Den statischen Member in einer .cpp Datei definieren... ;)

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

4

07.09.2013, 20:10

Danke erste inmal für eure Hilfe
aber ich möchte ja das der Vector private bleibt und wenn ich es so mache wie Mallco kriege ich auch eine Fehlermeldung nach dem Motto ist nicht mir dem in Zeile 22 deklarierten kompatibel.

5

07.09.2013, 20:11

Du musst statische Member erst initialisieren:

C-/C++-Quelltext

1
std::vector<TimeMember*> TimeClass::Member;

Das kannst du so hinter die Klassendeklaration schreiben.

Genaugenommen heißt es definieren und das wird so nur funktionieren, solange er den Header nur in einer einzigen .cpp Datei inkludiert, sonst wird der vector mehrfach definiert, was wiederum ebenfalls zu einem Linkerfehler führt. Besser: Den statischen Member in einer .cpp Datei definieren... ;)

Grund: Wenn es in der Header steht und dieser von mehreren Dateien inkludiert wird, dann wird jede Datei versuchen den vector zu definieren->BAAAAAM da knallts.Deshalb pack es in eine seperate Datei.(An diesem Punkt möchte ich dot danken, dass er mir das damals so toll erklärt hat :D)

6

07.09.2013, 20:13

Danke erste inmal für eure Hilfe
aber ich möchte ja das der Vector private bleibt und wenn ich es so mache wie Mallco kriege ich auch eine Fehlermeldung nach dem Motto ist nicht mir dem in Zeile 22 deklarierten kompatibel.


Man muss natürlich noch den Bereich angeben, wo TimeMember deklariert ist:

C-/C++-Quelltext

1
std::vector<TimeMember*> TimeClass::Member;

So nicht, sondern:

C-/C++-Quelltext

1
std::vector<TimeClass::TimeMember*> TimeClass::Member;


Keine Sorge...dein Vector bleibt weiterhin private, er muss nur iwo definiert werden :D

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

7

07.09.2013, 20:14

Der Header ist bis jetzt ein einziges mal includiert, in der dazu gehöhriegen .cpp.

8

07.09.2013, 20:17

Im Endeffekt sieht es so aus(Es steht jetzt alles in einer Datei...achte darauf, was dot gesagt hat) :

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
class TimeClass
{
private:
    struct TimeMember
    {
        TimeMember ();
        TimeMember (unsigned int MemberID, double Time);
        TimeMember (const TimeMember&);
        ~TimeMember ();

        unsigned int MemberID;
        double TimeStart;
        double Time;
    };

public:
    TimeClass(void);
    ~TimeClass(void);

    static double Time_in_sec (double Time);
    static unsigned int NewTimeMember ();
    static void DeletTimeMember (unsigned int TimeMember);
    static double GetTime ();

    static void SetTime (double Time, unsigned int TimeMember);
    static void SetTimeNULL (unsigned int TimeMember);
    static double MyTime (unsigned int TimeMember);

private:
    static void NewTime (double& Time);
    static std::vector <TimeMember*> Member;
};
std::vector<TimeClass::TimeMember*> TimeClass::Member;

Werbeanzeige