【问题标题】:C++: static variables not changing with static set() functionC++:静态变量不随静态 set() 函数改变
【发布时间】: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;你定义一个函数范围的局部静态变量。这些对于每个函数都是不同的,它们与类的静态成员变量不同。如果您只想使用这些,则必须删除变量定义并仅使用 xy
  • 您的所有函数都将x 和/或y 重新定义为statics。因此,每个函数都在修改它的本地变量,而不是在文件范围内声明的变量。这通常是由于将声明复制到函数中(例如复制/粘贴问题)造成的,所以我投票决定将其作为印刷错误关闭。
  • 你为什么把太阳底下的一切都标记为static?说真的,为什么?
  • Peter 和 Jodocus,感谢您的协助。但是,您的建议是我在提出问题之前尝试过的。从这些方法中引用 x 或 y,无论有无类名,都会使 g++ 启动错误:未定义对 `OurClass::x' 的引用(正如我已经向其他 2 个人解释过的那样)。
  • @StoryTeller 因为我正在测试关于静态成员的语言基础。我知道我可以在不求助于它的情况下做其他工作,但如果你不知道答案,那很好。

标签: c++ class static


【解决方案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;
}

【讨论】:

  • 当我尝试通过执行 OurClass::x 或 OurClass::y 访问任何成员时,g++ 将失败并显示以下消息:未定义对 `OurClass::x' 的引用
【解决方案2】:

此代码不是设置现有变量的值,而是创建新的局部静态变量。修复:

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;

【讨论】:

  • 这是我第一次尝试的方法,但是如果我引用带有或不带有类名的类变量,g++ 将启动此错误:undefined reference to `OurClass::x'
  • @JayY 为你更新了答案。
  • Maxim,您在 cc 中定义变量的建议,在它们用于静态函数之前,解决了它。所以确实有必要也定义它们。这就是解决方案。非常感谢。
猜你喜欢
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多