// main.cpp
struct Entry {
int x;
int y;
};
int main(){
// 实例化第一个结构体e
Entry e;
e.x = 2;
e.y = 3;
// 实例化第二个结构体e1
Entry e1 = { 5, 8};
std:cout << e.x << " , " << e.y << std:endl;
std:cout << e1.x << " , " << e1.y << std:endl;
}
最后的输出结果:
2 , 3
5, 8
将结构体中的变量更改为静态
struct Entry {
static int x;
static int y;
};
int main(){
// 实例化第一个结构体e
Entry e;
e.x = 2;
e.y = 3;
// 实例化第二个结构体e1
Entry e1 = { 5, 8};
std:cout << e.x << " , " << e.y << std:endl;
std:cout << e1.x << " , " << e1.y << std:endl;
}
再次运行,提示错误
无法解析的外部符号 "public: static int Entry::x" (?x@Entry@@2HA)
fatal error LNK1120: 2 个无法解析的外部命令
修改代码
增加一个静态的打印函数
struct Entry {
static int x;
static int y;
static void print() {
std::cout << x << ", " << y << std::endl;
}
};
int main()
{
Entry e;
e.x = 2;
e.y = 3;
Entry e1;
e1.x = 5;
e1.y = 8;
// 调用结构体提供的打印函数
e.print();
e.print();
std::cin.get();
}
结果还是会报以上的错误
再次修改代码,对结构体中的静态变量定义为全局变量
struct Entry {
static int x;
static int y;
static void print() {
std::cout << x << ", " << y << std::endl;
}
};
// 定义为全局变量
int Entry::x;
int Entry::y;
int main()
{
Entry e;
e.x = 2;
e.y = 3;
// 调用结构体提供的打印函数
Entry e1;
e1.x = 5;
e1.y = 8;
// 调用结构体提供的打印函数
e.print();
e1.print();
std::cin.get();
}
···
执行程序输出
5, 8
5. 8
根据输出的结果,e 与 e1 是两个不同的实例,但用于相同的变量,所以以上代码也可以更改为
```C++
int main()
{
Entry e;
Entry.x = 2;
Entry.y = 3;
// 调用结构体提供的打印函数
Entry e1;
Entry.x = 5;
Entry.y = 8;
// 调用结构体提供的打印函数
e.print();
e1.print();
std::cin.get();
}
输出的结果上一次是一致的,这里静态的struct 在系统中只有一份,所以我们没必要定义实例e与e1,
所有的静态方法和变量都可以直接引用,如下
int main()
{
Entry.x = 2;
Entry.y = 3;
// 调用结构体提供的打印函数
Entry.x = 5;
Entry.y = 8;
// 调用结构体提供的打印函数
Entry::print();
std::cin.get();
}
如果我们把struct 中的静态变量更改为普通变量,在静态方法中也是获取不到的
struct Entry {
int x;
int y;
static void print() {
std::cout << x << ", " << y << std::endl;
}
};
// 定义为全局变量
int Entry::x;
int Entry::y;
int main()
{
Entry e;
e.x = 2;
e.y = 3;
// 调用结构体提供的打印函数
Entry e1;
e1.x = 5;
e1.y = 8;
// 调用结构体提供的打印函数
e.print();
e1.print();
std::cin.get();
}
运行后提示错误
对非静态成员“Entry::x”的非法引用
网友评论