Undefinierter Verweis auf einen statischen Member

Lesezeit: 3 Minuten

Benutzer-Avatar
kakusch

Ich verwende einen Cross-Compiler. Mein Code ist:

class WindowsTimer{
public:
  WindowsTimer(){
    _frequency.QuadPart = 0ull;
  } 
private:
  static LARGE_INTEGER _frequency;
};

Ich bekomme folgenden Fehler:

undefinierter Verweis auf `WindowsTimer::_frequency’

Ich habe auch versucht, es zu ändern

LARGE_INTEGER _frequency.QuadPart = 0ull;

oder

static LARGE_INTEGER _frequency.QuadPart = 0ull;

aber ich bekomme immer noch Fehler.

weiß jemand warum?

  • mögliches Duplikat einer undefinierten Referenz für statisches Mitglied, Linkerfehler

    – iammilind

    2. Februar 2012 um 10:15 Uhr


  • Wo (wenn überhaupt) haben Sie definiert WindowsTimer::_frequency?

    – CB Bailey

    2. Februar 2012 um 10:16 Uhr

  • @CharlesBailey Es ist mein einziges Mitglied in der Klasse.

    – kakusch

    2. Februar 2012 um 10:35 Uhr

Sie müssen definieren _frequency in der .cpp-Datei.

dh

LARGE_INTEGER WindowsTimer::_frequency;

  • Warum sollte ich das tun?

    – nowox

    8. Oktober 2020 um 21:29 Uhr

  • @nowox Weil C++ nicht C# ist … ist ein statisches Datenelement im Grunde eine globale Variable, die sich zufällig im Namensraum ihrer Klasse befindet. Das Erklärung innerhalb der Klassendefinition ist wie ein extern Erklärung einer globalen Variablen: Sie gibt ihre Existenz, ihren Namen und ihren Typ bekannt, erzeugt aber nicht das Objekt (denn dann hätten Sie in jeder Datei ein Objekt, das den Header mit der Klassendefinition enthält, das Gegenteil von dem, was gewünscht ist). Stattdessen gibt es genau ein Definition dieses Objekts in einer der cpp-Dateien, und der Linker löst Code auf, der diesen Namen für dieses Objekt verwendet.

    – Peter – Setzen Sie Monica wieder ein

    22. März 2021 um 12:10 Uhr

  • @nowox Der Grund, warum Sie vor C ++ 17 eine separate Objektdefinition benötigten, hängt mit dem veralteten Build-Paradigma von C ++ zusammen: Es verwendet die Idee der 1970er Jahre von “Übersetzungseinheiten” (Dateien nach der Peverarbeitung), die separat in Objektdateien mit Sparse kompiliert werden Informationen (z. B. keine Typinformationen etc.). Die Verknüpfungsphase ist sprachunabhängig (z. B. weiß nichts über C++) und getrennt von der Kompilierungsphase. (Forts.)

    – Peter – Setzen Sie Monica wieder ein

    22. März 2021 um 12:18 Uhr

  • (Forts.) Umgebungen wie Java oder C# hingegen erzeugen “semantisch angereicherte” Kompilierungsartefakte (Klassen, Pakete), typischerweise aus mehreren Quelldateien auf einmal: Kompilierung und Verknüpfung sind nicht klar getrennt, was eine bessere Interaktion zwischen Code in verschiedenen Dateien ermöglicht .

    – Peter – Setzen Sie Monica wieder ein

    22. März 2021 um 12:23 Uhr

Mit C++17 können Sie Ihre Variable deklarieren im Einklanges muss nicht mehr in einer cpp-Datei definiert werden.

inline static LARGE_INTEGER _frequency;

Benutzer-Avatar
Wyktor

Linker weiß nicht, wo er Daten zuweisen soll _frequency und Sie müssen es manuell sagen. Sie können dies erreichen, indem Sie einfach diese Zeile hinzufügen: LARGE_INTEGER WindowsTimer::_frequency = 0; in eine Ihrer C++-Quellen.

Genauere Erklärung hier

Wenn innerhalb der Klasse eine statische Variable deklariert ist, sollten Sie sie wie folgt in der cpp-Datei definieren

LARGE_INTEGER WindowsTimer::_frequency = 0;

Dies ist ein vollständiges Codebeispiel für diese andere Frage, die tatsächlich ein Duplikat dieser Frage ist.

#include <iostream>

#include <vector>
using namespace std;

class Car
{

public:
    static int b;                   // DECLARATION of a static member


    static char* x1(int x)
    {
        b = x;                      // The static member is used "not as a constant value"
                                    //  (it is said ODR used): definition required
        return (char*)"done";
    }

};

int Car::b;                         // DEFINITION of the static 

int main()
{
    char* ret = Car::x1(42);
    for (int x = 0; x < 4; x++)
    {
        cout << ret[x] << endl;
    }

    return 0;
}

  • Danke für deine Antwort. Können Sie bitte einen Link teilen, wo ich mehr über statische Elementfunktionen (wichtig) und statische Variablen lesen kann (ich habe das oft gesehen). Das enthält weitere Details und Beispiele für statische Funktionen und statischen Konstruktor für eine Klasse vortäuschen

    – Benutzer786

    30. Juni 2021 um 14:01 Uhr

  • Danke für deine Antwort. Können Sie bitte einen Link teilen, wo ich mehr über statische Elementfunktionen (wichtig) und statische Variablen lesen kann (ich habe das oft gesehen). Das enthält weitere Details und Beispiele für statische Funktionen und statischen Konstruktor für eine Klasse vortäuschen

    – Benutzer786

    30. Juni 2021 um 14:01 Uhr

1013620cookie-checkUndefinierter Verweis auf einen statischen Member

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy