C ++:静态变量不随静态set()函数而改变

时间:2018-04-05 09:34:31

标签: c++ class static

在阅读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()函数中指定的值(BTW是我在这里得到的另一个建议,即在方法中初始化静态变量)。 即使我将它们公开,我也无法通过OurClass :: x或y直接引用变量。 你们知道为什么吗?

2 个答案:

答案 0 :(得分:1)

此代码不是设置现有变量的值,而是创建新的本地静态变量。修正:

void OurClass::initialize()
{
    x = 0;
    y = 0;
}

void OurClass::setVals(int valx, int valy)
{
    x = valx;
    y = valy;
}

int OurClass::getValx()
{
    return x;
}

int OurClass::getValy()
{
    return y;
}

.cc文件(不是标题)中添加这些静态变量的定义

int OurClass::x;
int OurClass::y;

答案 1 :(得分:1)

首先,您需要访问本地类的静态变量,而不是在每个方法中声明新方法局部变量。检查下面。

class Out {
private:
    static int x, y;

public:
    void set(int x, int y);
    int getSum();
};

int Out::x = 0;
int Out::y = 0;

void Out::set(int x, int y) {
    Out::x = x;
    Out::y = y;
}

int Out::getSum() {
    return Out::x + Out::y;
}