Нестатические члены в C ++

0
  1. ошибка C2648: 'stack :: Y': использование члена как параметра по умолчанию требует статического члена
  2. ошибка C2648: 'stack :: X': использование члена как параметра по умолчанию требует статического члена
  3. IntelliSense: ссылка на нестатический элемент должна быть относительно конкретного объекта
  4. IntelliSense: ссылка на нестатический элемент должна быть относительно конкретного объекта

Пожалуйста, помогите исправить

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
    Что вы пытаетесь сделать с void makelist(int = X, int = Y); параметры по умолчанию? Он говорит, что вы не можете сделать это, не будучи статичным.
Теги:

4 ответа

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

Некоторые люди говорят, что перегрузка лучше, чем использование значений по умолчанию, потому что вы, вероятно, не хотите поддерживать вызов makelist с 1 параметром, только с 0 или 2 параметрами (или, если вы действительно этого хотите, вы можете добавить еще одну перегрузку, с 1 параметр).

  • 0
    Спасибо! Это то, что я хочу
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
{
    ...
}
  • 0
    OP называет его как makelist() , так что ОП полностью не намерено иметь значения по умолчанию.
  • 0
    Я пытаюсь установить значение параметров по умолчанию
Показать ещё 1 комментарий
1

Предполагая, что вы хотели использовать значения по умолчанию

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, то это потому, что компилятор резервирует _??? для себя или для библиотек.

1

Избавиться от этих знаков = в объявлении функции:

void makelist(int x, int y);

так что это точно так же, как определение:

void stack::makelist(int x, int y)
{
  • 0
    Предполагая, что они не пытаются использовать значения по умолчанию ... (обратите внимание на подпись для push(int, int) )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню