[英]Non static members in 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;
}
(這是對我的舊答案的更正,這是不正確的)
似乎您想使用非靜態成員作為參數的默認值,並且編譯器告訴您這是不可能的。 您可以使用重載作為解決方法:
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);
...
};
有人會說重載比使用默認值更好,因為您可能不希望僅使用0或2個參數來支持僅使用1個參數調用makelist
(或者,如果您確實希望這樣做,則可以使用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
{
...
}
消除函數聲明中的那些=
符號:
void makelist(int x, int y);
所以就像定義:
void stack::makelist(int x, int y)
{
假設您打算使用默認值
void makelist(int x_ = X, int y_ = Y); //error is here
不允許這樣做,因為默認值必須是編譯時常量或可編譯時可尋址的,而未實例化類的成員則不允許。 編譯器需要一個能夠生成代碼的地址。
您可以重載該功能
void makelist(int x_, int y_);
void makelist() { makelist(X,Y); }
因此,您得到的行為幾乎與您要求的相同。
如果您對_X和_Y有問題,則是因為編譯器保留了_ ??? 本身或圖書館。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.