使用 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..
,代码就会编译通过
我正在为 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..
,代码就会编译通过