【问题标题】:accessing a static variable in C++在 C++ 中访问静态变量
【发布时间】:2013-04-30 21:17:18
【问题描述】:

我正在使用 Qt Creator 来尝试创建一个基本的计算器应用程序。我试图测试前几个方法并且必须编写一个以使其余的编码更容易,但是,该方法没有编译。我正在尝试访问一个包含计算器屏幕当前值的静态变量,但它不断给我:

C:\Users\****\Documents\Qt Projects\SimpleCalculator\calculator.cpp:15: error: C2248: 'Calculator::currVal' : cannot access private member declared in class 'Calculator'

这是Calculator.cpp

    #include "calculator.h"
#include <QLCDNumber>

Calculator::Calculator(QWidget *parent) :
    QWidget(parent), ui(new Ui::Calculator)
{
    ans = 0;
    currVal = 0;
    setupUi(this);

}

//problem method
QString getNewVal(qint64 nextDig)
{
    //--------------------------------------------
    long long int val = Calculator::currVal;//this is where I am trying to access the variable
    //--------------------------------------------
    if(nextDig==0)
    {
        if(val > 0)
        {
            QString str = QString::number(val);
            str.append("0");
            return str;
        }
        else
        {
            return "0";
        }
    }
    else if(nextDig==1)
    {
        QString str = QString::number(val);
        str.append("1");
        return str;
    }
    return NULL;
}

void Calculator::on_Zero_clicked()
{
    ui->Display->display(getNewVal(0));
    currVal = ui->Display->intValue();
}

void Calculator::on_One_clicked()
{

}

这是头文件:

#ifndef CALCULATOR_H
#define CALCULATOR_H
#include "ui_calculator.h"

class Calculator : public QWidget, private Ui::Calculator
{

    Q_OBJECT


public:
     Calculator(QWidget *parent = 0);

private slots:
    void on_Zero_clicked();
    void on_One_clicked();
private:
    Ui::Calculator *ui;
    QString getNewVal(quint64);
    static long long int ans;
    static long long int currVal;


};

long long int Calculator::ans = 0;
long long int Calculator::currVal = 0;
#endif


 // CALCULATOR_H

【问题讨论】:

    标签: c++ variables static


    【解决方案1】:
    Calculator::currVal;//this is where I am trying to access the variable
    

    不起作用,因为该值在您的标头中被声明为私有(如警告所示):

    private:
        Ui::Calculator *ui;
        QString getNewVal(quint64);
        static long long int ans;
        **static long long int currVal;**
    

    和你的功能:

    QString getNewVal(qint64 nextDig)
    

    不属于班级。

    【讨论】:

    • 好吧,当我将方法更改为:“QString Calculator::getNewVal(***)”时,我收到此错误:“C:\Users****\Documents\Qt Projects\SimpleCalculator \calculator.cpp:18: 错误: C2511: 'QString Calculator::getNewVal(qint64)' : 在 'Calculator' 中找不到重载的成员函数"
    【解决方案2】:

    这个

    static long long int currVal;
    

    是私人的!

    尝试:

    public:
       static long long int currVal;
    

    或为此创建一个 getter 方法。

    您也可以将getNewVal 设为您班级的朋友功能:

    public:
        friend QString ::getNewVal(qint64 nextDig);
    

    【讨论】:

    • 我已经尝试过了,但是这样做会给我带来一些错误。我知道它是私有的,但是当我将它置于公开状态时,我得到了大约 6 个错误。
    • 你试过getter方法吗?比如static int getCurrVal(){return currVal;};
    • 啊酷,不知道你可以把一个全局函数变成朋友:)
    【解决方案3】:

    你需要指定getNewVal属于Calculator

    QString Calculator::getNewVal(quint64 nextDig)
    //      ^^^^^^^^^^             ^
    //   This was missing          |
    //                             |
    //   Add 'u' above to match the declaration
    

    否则,C++ 认为这是一个独立的函数(尽管你已经在Calculator 中声明了一个同名的成员函数)。

    你还需要移动这两个定义

    long long int Calculator::ans = 0;
    long long int Calculator::currVal = 0;
    

    从头文件到实现文件。

    【讨论】:

    • 当我这样做时,我得到这个错误:“C:\Users****\Documents\Qt Projects\SimpleCalculator\calculator.cpp:15: error: C2511: 'QString Calculator:: getNewVal(qint64)' : 在 'Calculator' 中找不到重载的成员函数"
    • @user2337530 那是因为你在实现中缺少u:你输入qint64而不是quint64
    • 热爱编程。 -_- 我完全错过了。现在,它会编译。谢谢
    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多