我有一个包含静态属性的简单类。这个类中有两个静态方法:一个用于获取静态属性,另一个用于初始化它。然而,当调用静态方法时,编译器会报告错误。
班级:
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
答案 0 :(得分:4)
您需要定义静态变量,即使它未显式初始化也是如此。这就是代码中缺少的内容。你应该提供一个简单的例子来重现这个问题,但为方便起见,我提供了一个有效的例子。
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;
}
注意:我建议让某人查看您的代码,因为“未设置”是不正确的英语。如果我们在这,你可能也需要修复你的缩进。
答案 1 :(得分:4)
在您的代码中没有unsetted
的定义,只有声明。
解决方案是将cpp文件中的某个位置放在这样的一行:
int Sudoku::unsetted
原因是Sudoku
类的每个实例都将使用相同的unsetted
成员,因此无法为每个成员定义它们,因此程序员只能在一个地方定义它
答案 2 :(得分:2)
在cpp文件中,定义静态变量(理想情况下是初始化):
int Sudoku::unsetted = 0;
答案 3 :(得分:2)
如果要在类中声明任何静态变量,那么您也应该在类外定义该变量。
示例:
class A
{
public:
static int x; // declaration
};
int A::x; // definition