使用 static int 时 Visual Studio 2017 中的错误 LNK2001

Error LNK2001 in Visual Studio 2017 when using static int

我正在为 uni 做一些练习任务,我应该在 class 中创建 static int 字段,但是当我这样做时我收到错误 LNK2001。当我将其更改为常规 int 时,不会发生错误。有人可以帮我吗?这是我的代码:

#include <iostream>
#include <string>

using namespace std;

class Uczelnia {
public:
    virtual string getName() = 0;

    static int liczba_wszystkich_studentow;

};

class Politechnika:public Uczelnia {
public:
    Politechnika(string a, int b) {
        nazwa = a;
        liczba_studentow = b;
        liczba_wszystkich_studentow = +liczba_studentow;
    }

    string getName() {
        cout << "Politechnika: " << nazwa << endl;
        return nazwa;
    }

    ~Politechnika() {
        liczba_wszystkich_studentow = -liczba_studentow;
    }

private:
    string nazwa;
    int liczba_studentow;
};

class Uniwersytet :public Uczelnia {
public:
    Uniwersytet(string a, int b) {
        nazwa = a;
        liczba_studentow = b;
        liczba_wszystkich_studentow = +liczba_studentow;
    }

    string getName() {
        cout << "Uniwersytet: " << nazwa << endl;
        return nazwa;
    }

    ~Uniwersytet() {
        liczba_wszystkich_studentow = -liczba_studentow;
    }

private:
    string nazwa;
    int liczba_studentow;
};



int main() {
    Politechnika p1("Warszawska", 200);
    p1.getName();

    Uniwersytet u1("Warszawski", 600);
}

您收到链接器错误,因为您尚未初始化静态成员。 您只需要在 class.

之外初始化它
class Uczelnia {
public:
//..
    static int liczba_wszystkich_studentow;
//..
};

int Uczelnia::liczba_wszystkich_studentow = 5;

能够在 class 中初始化 static const 整数类型(如 int)还有一些额外的复杂性,但对于其他类型,您通常会初始化这些静态成员class 定义之外的源文件。

在 class 定义中有静态数据成员的声明而不是它们的定义。 class 定义中声明的静态数据成员甚至可能具有不完整的类型。如果使用 ODR 静态数据成员,则应在某些模块中的 class 定义之外定义它。例如

int Uczelnia::liczba_wszystkich_studentow;

在 C++ 17 中,您可以在 class 定义中的静态数据成员声明中使用 inline 说明符。

例如

class Uczelnia {
public:
    virtual string getName() = 0;

    inline static int liczba_wszystkich_studentow;

};

在这种情况下,只要编译器支持 C++ 17..

,代码就会编译通过