《Heaven》 2024-03-20 18:19 采纳率: 0%
浏览 4

实现栈的时候判断为空报错


class Stack {
public:
    Stack(int size);
    ~Stack();
    //bool stackEmpty() ;
    bool stackEmpty() const {
        if (top == base) {
            return true;
        }
        return false;
    }
    bool stackFull() const ;

private:

    int* base;    //栈底指针
    int* top;        //栈顶指针
    int size; //= MAXSIZE;
};

//实现
Stack::Stack(int size) {
    base = new int[size];
    std::cout << "构造 " << std::endl;
    this->size = size;
    top = base;
}
Stack::~Stack() {
    delete[] base;
    size = 0;
    base = top = NULL;
    std::cout << "析构" << std::endl;
}

上面实现栈的时候报错
错误 C3867 “Stack::stackEmpty”: 非标准语法;请使用 "&" 来创建指向成员的指针
具体是什么原因啊?求帮忙,用的软件是visual studio

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-20 18:19
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这个错误是因为使用了非标准的成员函数指针语法。在调用成员函数指针时,应该使用"&类名::成员函数名"来表示指向成员函数的指针。 修改后的代码如下:
    class Stack {
    public:
        Stack(int size);
        ~Stack();
        bool stackEmpty() const; // 修改成员函数声明
        bool stackFull() const; // 修改成员函数声明
    private:
        int* base;
        int* top;
        int size;
    };
    Stack::Stack(int size) {
        base = new int[size];
        std::cout << "构造 " << std::endl;
        this->size = size;
        top = base;
    }
    Stack::~Stack() {
        delete[] base;
        size = 0;
        base = top = NULL;
        std::cout << "析构" << std::endl;
    }
    bool Stack::stackEmpty() const { // 修改成员函数实现
        if (top == base) {
            return true;
        }
        return false;
    }
    bool Stack::stackFull() const { // 修改成员函数实现
        if (top - base == size) {
            return true;
        }
        return false;
    }
    

    其中,修改成员函数时,在成员函数名后加了const关键字,表示这个函数不会修改类的成员变量。同时,在调用成员函数指针时,应该使用"&类名::成员函数名"来表示指向成员函数的指针。 示例代码:

    Stack s(10);
    bool (Stack::*empty)(void) const = &Stack::stackEmpty;
    bool (Stack::*full)(void) const = &Stack::stackFull;
    if ((s.*empty)()) {
        std::cout << "栈为空" << std::endl;
    } else {
        std::cout << "栈不为空" << std::endl;
    }
    if ((s.*full)()) {
        std::cout << "栈已满" << std::endl;
    } else {
        std::cout << "栈未满" << std::endl;
    }
    

    上述代码中,定义了两个指向成员函数的指针empty和full,通过在对象名前加上"."和"*"来调用成员函数指针。如果不使用成员函数指针,直接在代码中调用成员函数,可以这样写:

    Stack s(10);
    if (s.stackEmpty()) {
        std::cout << "栈为空" << std::endl;
    } else {
        std::cout << "栈不为空" << std::endl;
    }
    if (s.stackFull()) {
        std::cout << "栈已满" << std::endl;
    } else {
        std::cout << "栈未满" << std::endl;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月20日

悬赏问题

  • ¥15 matlab矩阵复数本征值排序
  • ¥15 skynet MySQL ProtocolBuffers
  • ¥15 浏览器关闭事件有时没执行怎么回事
  • ¥15 使用docker安装chemex后无法启动
  • ¥15 关于#vue.js#的问题:word excel和ppt预览问题语言-javascript)
  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流