【问题标题】:Can't call a static method in Qt无法在 Qt 中调用静态方法
【发布时间】:2014-01-06 17:18:55
【问题描述】:

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

班级:

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

【问题讨论】:

  • 尝试将unsetted 放入cpp 文件中:int Sudoku::unsetted = 0
  • 你可能会找到答案here
  • @Angew:这个问题的主题太宽泛了。
  • @AdriC.S.:不,那是不必要的。默认初始化为零!
  • @LaszloPapp 它可能是零初始化的,但它仍然需要在 .cpp 文件中定义,而 OP 显然没有提供。所以= 0 是不必要的,但它需要定义本身。

标签: c++ qt class static


【解决方案1】:

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

main.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;
}

注意:我建议找人检查您的代码,因为“未设置”是不正确的英文。如果我们这样做了,您可能还需要修复缩进。

【讨论】:

  • 如果我错了,请解释this。这不是关于初始化,而是关于定义。非常量静态类成员需要一个,句号。
  • 这项工作很好注意:初始化和定义应该在.CCP文件中。谢谢你们 。 شكرا
  • @LaszloPapp 现在,没问题(请注意,我早就删除了反对票)。请参阅我 17 分钟前的评论。
【解决方案2】:

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

解决方案是在你的 cpp 文件中的某处放置这样一行:

int Sudoku::unsetted

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

【讨论】:

    【解决方案3】:

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

    int Sudoku::unsetted = 0;
    

    【讨论】:

    • 问题不在初始化。问题在于它自己的定义。谢谢问题解决了。
    【解决方案4】:

    如果您在类中声明任何静态变量,那么您也应该在类外定义该变量。

    例子:

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

    【讨论】:

    • 不是“定义”和“初始化”,而是“声明”和“定义”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多