簡體   English   中英

C ++中的非靜態成員

[英]Non static members in C++

  1. 錯誤C2648:“堆棧:: Y”:使用成員作為默認參數需要靜態成員
  2. 錯誤C2648:“堆棧:: 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;
}

(這是對我的舊答案的更正,這是不正確的)

似乎您想使用非靜態成員作為參數的默認值,並且編譯器告訴您這是不可能的。 您可以使用重載作為解決方法:

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

“ =”字符使它看起來像聲明具有默認參數,其值為XY ,這完全不是您要執行的操作。

另外,習慣上在聲明和定義中使用相同的參數名稱:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM