【发布时间】:2018-09-15 01:46:42
【问题描述】:
在阅读了 StackOverflow 的讨论并实施了一些建议之后,我编写了这些代码片段,旨在测试类的静态成员的行为。 这是具有类声明的标题:
class OurClass
{
private:
static int x, y;
public:
static void setVals(int valx, int valy);
static int getValx();
static int getValy();
static void initialize();
};
这里是cpp文件,里面有这些成员的定义以及main()函数:
#include <iostream>
#include "OurClass.hpp"
using namespace std;
void OurClass::initialize()
{
static int x = 0;
static int y = 0;
}
void OurClass::setVals(int valx, int valy)
{
static int x = valx;
static int y = valy;
}
int OurClass::getValx()
{
static int x;
return x;
}
int OurClass::getValy()
{
static int y;
return y;
}
int main(void)
{
OurClass::inicializa();
cout << "Provide x and y..." << endl;
OurClass::setVals(cin.get(), cin.get());
cout << "Value of x: " << OurClass::getValx() << endl;
cout << "Value of y: " << OurClass::getValy() << endl;
return 0;
}
因此,假设该类存在一个静态变量,并且静态函数只访问静态变量,我期望 x 和 y 将具有我们通过 main() 中的 setVals() 调用从键盘读取的值)。但是当在 couts 中打印它们的值时,它们仍然具有我们在 initialize() 函数中分配的值(顺便说一句,这是我在这里得到的另一个建议,即在方法中初始化一个静态变量)。 即使我将变量公开,我也无法直接引用 OurClass::x 或 y 的变量。 你们知道为什么吗?
【问题讨论】:
-
每次你写
static int y;你定义一个函数范围的局部静态变量。这些对于每个函数都是不同的,它们与类的静态成员变量不同。如果您只想使用这些,则必须删除变量定义并仅使用x和y。 -
您的所有函数都将
x和/或y重新定义为statics。因此,每个函数都在修改它的本地变量,而不是在文件范围内声明的变量。这通常是由于将声明复制到函数中(例如复制/粘贴问题)造成的,所以我投票决定将其作为印刷错误关闭。 -
你为什么把太阳底下的一切都标记为
static?说真的,为什么? -
Peter 和 Jodocus,感谢您的协助。但是,您的建议是我在提出问题之前尝试过的。从这些方法中引用 x 或 y,无论有无类名,都会使 g++ 启动错误:未定义对 `OurClass::x' 的引用(正如我已经向其他 2 个人解释过的那样)。
-
@StoryTeller 因为我正在测试关于静态成员的语言基础。我知道我可以在不求助于它的情况下做其他工作,但如果你不知道答案,那很好。