请帮助解决问题
class stack{
node *head, *tail;
int maze[10][10], X, Y, _X, _Y;
public:
stack():head(0), tail(0){};
~stack();
void load();
void makelist(int = X, int = Y); //error is here
void push(int, int);
void pop();
void print();
};
void stack::load(){
ifstream fin("maze.txt");
fin >> X >> Y >> _X >> _Y;
cout << "Loaded matrix:" << endl << endl;
for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
fin >> maze[i][j];
if (i == X && j == Y)
cout << "S ";
else if (i == _X && j == _Y)
cout << "F ";
else
cout << maze[i][j] << " ";
}
cout << endl;
}
}
void stack::makelist(int x, int y)
{
if (x == _X && y == _Y)
{
push(x, y);
print();
pop();
return;
}
if (x > 0) if (maze[x - 1][y] == 0) { maze[x][y] = 1; push(x, y); makelist(x - 1, y); pop(); maze[x][y] = 0; }
if (x < 9) if (maze[x + 1][y] == 0) { maze[x][y] = 1; push(x, y); makelist(x + 1, y); pop(); maze[x][y] = 0; }
if (y > 0) if (maze[x][y - 1] == 0) { maze[x][y] = 1; push(x, y); makelist(x, y - 1); pop(); maze[x][y] = 0; }
if (y < 9) if (maze[x][y + 1] == 0) { maze[x][y] = 1; push(x, y); makelist(x, y + 1); pop(); maze[x][y] = 0; }
}
<...>
int main()
{
stack obj;
obj.load();
obj.makelist();
system("pause");
return 0;
}
答案 0 :(得分:3)
(这是对我的旧答案的更正,这是不正确的)
您似乎希望使用非静态成员作为参数的默认值,编译器会告诉您这是不可能的。您可以使用重载作为解决方法:
class stack{
node *head, *tail;
int maze[10][10], X, Y, _X, _Y;
public:
void makelist() {makelist(X, Y);} // I added this overload to do what you want
void makelist(int x, int x);
...
};
有些人会说重载比使用默认值更好,因为你可能不想支持使用1个参数调用makelist
,只有0或2个参数(或者,如果你真的想要这个,你可以添加另一个重载,带有1个参数)。
答案 1 :(得分:1)
你有一个虚假的&#34; =&#34;代码中的字符;用以下内容替换错误的行:
void makelist(int X, int Y);
&#34; =&#34; character使得它看起来像声明的默认参数,其值为X
和Y
,这完全不是你想要做的。
此外,习惯上在声明和定义中具有相同的参数名称:
void makelist(int x, int x); // declaration - I replaced X by x, Y by y
...
void stack::makelist(int x, int y) // definition - has lowercase names, which are good
{
...
}
答案 2 :(得分:1)
摆脱函数声明中的=
个符号:
void makelist(int x, int y);
所以它就像定义一样:
void stack::makelist(int x, int y)
{
答案 3 :(得分:1)
假设您打算使用默认值
void makelist(int x_ = X, int y_ = Y); //error is here
这是不允许的,因为默认值必须是compiletime constants或compiletime addressable,而未实例化的类的成员不是。 编译器需要一个能够生成代码的地址。
您可以重载功能
void makelist(int x_, int y_);
void makelist() { makelist(X,Y); }
所以得到的行为几乎和你问的一样。
如果您对_X&amp; _Y然后它因为编译器保留_ ???为自己或图书馆。