无法在Qt中调用静态方法

Can't call a static method in Qt

本文关键字:调用 静态方法 Qt      更新时间:2023-10-16

>我有一个简单的类,其中包含一个静态属性。此类中有两个静态方法:一个用于获取静态属性,另一个用于初始化它。然而,当调用静态方法时,编译器会报告错误。

班级:

class Sudoku {
    Cell Grid[9][9];
    int CurrentLine;
    int CurrentColumn;
    void deleteValInColumn(int val, int col);
    void deleteValInRow(int val, int row);
    void deleteValInBox(int val, int x, int y);
    static int unsetted; //!
public:
    static void IniUnsetted() { //!
        unsetted = 0;
    }
    static int GetUns() { //!
        return unsetted;
    }
    Sudoku(ini InitGrid[9][9]);
    void Calculate_Prob_Values();
    Cell getCell(int x, int y);
    QVector<int> getPossibleValues(int x, int y);
    bool SolveIt();
};

这是我得到的错误:

In member function 'bool Sudoku::SolveIt()':
no return statement in function returning non-void [-Wreturn-type]
In function `ZN6Sudoku6GetUnsEv':
undefined reference to `Sudoku::unsetted` error: ld returned 1 exit status

您需要定义静态变量,即使它没有显式初始化。这就是您的代码中缺少的内容。您应该提供一个简单的示例来重现该问题,但为了您的方便,我提供了一个有效的示例。

主.cpp

class Foo {
    public:
        static int si;
        static void bar();
};
int Foo::si = 0; // By default, it will be initialized to zero though.
void Foo::bar() {
     Foo::si = 10;
};
int main()
{
    Foo::bar();
    return 0;
}

注意:我建议找人审查你的代码,因为"未设置"是不正确的英语。如果我们在做这件事,您可能还需要修复缩进。

在你的代码中没有unsetted的定义,只有声明。

解决方案是在 cpp 文件中的某个位置放置一行,如下所示:

int Sudoku::unsetted

这样做的原因是Sudoku类的每个实例化都将使用相同的unsetted成员,因此无法为每个成员定义它,因此程序员只能在一个地方定义它。

在 cpp 文件中,定义静态变量(最好使用初始化):

int Sudoku::unsetted = 0;

如果要在类中声明任何静态变量,则还应在类外部定义该变量。

例:

class A
{
    public:
    static int x;    // declaration
};
int A::x;            // definition