2014-09-10 6 views
0
  1. ошибка C2648: «стек :: Y»: использование элемента в качестве параметра по умолчанию требуется статический член
  2. ошибка C2648: «стек :: X»: использование элемента в качестве параметра по умолчанию требуется статический член
  3. IntelliSense: нестатический контрольный элемент должен быть по отношению к конкретному объекту
  4. IntelliSense: нестатический контрольный элемент должен быть по отношению к конкретному объекту

Пожалуйста, помогите исправить этоNon статические члены в C++

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);', параметры по умолчанию? В нем говорится, что вы не можете сделать это без статичности. – crashmstr

ответ

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

Спасибо! Это то, что я хочу – ambrs

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()', поэтому OP полностью * делает * намеревается иметь значения по умолчанию. – hvd

+0

Я пытаюсь установить значение по умолчанию для параметров – ambrs

+0

Этот ответ неверен; Я оставлю это здесь только для комментариев – anatolyg

1

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

void makelist(int x, int y); 

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

void stack::makelist(int x, int y) 
{ 
+0

Предполагая, что они не пытаются использовать значения по умолчанию ... (обратите внимание на подпись для 'push (int, int)') – crashmstr

1

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

void makelist(int x_ = X, int y_ = Y); //error is here 

Это не допускается в качестве значения по умолчанию должно быть константами или compiletime compiletime адресации, которые члены не реализованным класс не являются. Компилятору нужен адрес, способный генерировать код.

Вы можете перегрузить функцию

void makelist(int x_, int y_); 
void makelist() { makelist(X,Y); } 

И так получить почти такое же поведение, как вы просили.

Если у вас есть проблема с _X & _Y, то это потому, что компилятор резервирует _ ??? для себя или для библиотек.

Смежные вопросы