C ++中的非静态成员

时间:2014-09-10 14:48:13

标签: c++

  1. 错误C2648:'stack :: Y':使用member作为默认参数 需要静态成员
  2. 错误C2648:'stack :: X':使用member作为默认参数 需要静态成员
  3. IntelliSense:非静态成员引用必须与a相关 具体对象
  4. IntelliSense:非静态成员引用必须与a相关 具体对象
  5. 请帮助解决问题

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

4 个答案:

答案 0 :(得分: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);
    ...
};

有些人会说重载比使用默认值更好,因为你可能不想支持使用1个参数调用makelist,只有0或2个参数(或者,如果你真的想要这个,你可以添加另一个重载,带有1个参数)。

答案 1 :(得分:1)

你有一个虚假的&#34; =&#34;代码中的字符;用以下内容替换错误的行:

void makelist(int X, int Y);

&#34; =&#34; character使得它看起来像声明的默认参数,其值为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
{
    ...
}

答案 2 :(得分:1)

摆脱函数声明中的=个符号:

void makelist(int x, int y);

所以它就像定义一样:

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

答案 3 :(得分:1)

假设您打算使用默认值

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

这是不允许的,因为默认值必须是compiletime constants或compiletime addressable,而未实例化的类的成员不是。 编译器需要一个能够生成代码的地址。

您可以重载功能

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

所以得到的行为几乎和你问的一样。

如果您对_X&amp; _Y然后它因为编译器保留_ ???为自己或图书馆。