Пожалуйста, помогите исправить
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;
}
(это исправление моего старого ответа, которое было неверным)
Кажется, что вы хотите использовать нестатический член как значение по умолчанию для параметра, и компилятор говорит вам, что это невозможно. Вы можете использовать перегрузку в качестве обходного пути:
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);
...
};
Некоторые люди говорят, что перегрузка лучше, чем использование значений по умолчанию, потому что вы, вероятно, не хотите поддерживать вызов makelist
с 1 параметром, только с 0 или 2 параметрами (или, если вы действительно этого хотите, вы можете добавить еще одну перегрузку, с 1 параметр).
У вас есть ложный символ "=" в вашем коде; замените вашу строку на ошибку следующим:
void makelist(int X, int Y);
Символ "=" делает его похожим на то, что объявление имеет параметры по умолчанию, значения которых 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
{
...
}
makelist()
, так что ОП полностью не намерено иметь значения по умолчанию.
Предполагая, что вы хотели использовать значения по умолчанию
void makelist(int x_ = X, int y_ = Y); //error is here
Это не допускается, так как значения по умолчанию должны быть константами compileime или адресными именами, которые не являются экземплярами класса. Компилятору необходимо, чтобы адрес мог генерировать код.
Вы можете перегрузить функцию
void makelist(int x_, int y_);
void makelist() { makelist(X,Y); }
И так поступайте почти так же, как вы просили.
Если у вас есть проблема с _X & _Y, то это потому, что компилятор резервирует _??? для себя или для библиотек.
Избавиться от этих знаков =
в объявлении функции:
void makelist(int x, int y);
так что это точно так же, как определение:
void stack::makelist(int x, int y)
{
push(int, int)
)
void makelist(int = X, int = Y);
параметры по умолчанию? Он говорит, что вы не можете сделать это, не будучи статичным.