微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在C ++中,模板类型的“ stack”类的isEmpty不继承到模板类型的派生类“ specialStack”中?

如何解决为什么在C ++中,模板类型的“ stack”类的isEmpty不继承到模板类型的派生类“ specialStack”中?

我有一个用于创建堆栈数据结构的类模板“ Stack”。另一个类模板“ specialStack”(公开继承了“ stack”类),用于以O(1)时间复杂度从堆栈中获取最小元素-getMin()可以完成此工作。

从基类继承isEmpty()时出错。它显示了isEmpty()未声明的标识符(如下面的屏幕快照所示)。我发现要解决此问题,我们必须再次重写派生类中的函数,但是如果我们在基类中有很多函数,则不可能重写所有函数。我还尝试了第二种方法,通过在派生类中使用stack :: isEmpty()来解决此问题,但现在又给了我很多错误

这是我的代码:-

#include<iostream>
using namespace std;
template<class T>
class stack {
    static const int max = 100;
    int arr[max];
    int top = -1,size = max;
public:
    void push(T x);
    T pop();
    int isEmpty();
    T topElement();
};
template<class T>
int stack<T>::isEmpty() {
    if (top == -1) return 1;
    return 0;
}
template<class T>
void stack<T>::push(T x) {
    if (top!=size) arr[++top] = x;
}
template<class T>
T stack<T>::pop() {
    if (top != -1)
    {
        return arr[top--];
    }
}
template<class T>
T stack<T>::topElement() {
    if (top != -1) return arr[top];
}
template<class T>
class specialStack : public stack<T> {
    stack<T>min;
public:
    void push(T x);
    T pop();
    T getMin();
};
template<class T>
void specialStack<T>::push(T x) {
    if (isEmpty()) {
        min.push(x);
        stack::push(x);
    }
    else {
        T y = min.topElement();
        if (x < y)
        {
            stack::push(x);
            min.push(x);
        }
        else {
            stack::push(x);
            min.push(y);
        }
    }
}
template<class T>
T specialStack<T>::pop() {
    if (true)
    {
        min.pop();
        stack::pop();
    }
}
template<class T>
T specialStack<T>::getMin() {
    return min.topElement();
}
int main() {
    specialStack<int>st;
    st.push(1);
    st.push(2);
    st.push(3);
    st.push(4);
    st.push(5);
    st.push(6);
    cout << st.getMin();
}

这是错误屏幕截图:

解决方法

您还应该将模板参数T传递给基类stack,因为它是模板类,然后使用stack<T>::范围运算符调用其所有函数。

因此您将拥有:

stack<T>::push(x);

stack<T>::isEmpty();
,

const Game = () => { const canvasRef = useRef<HTMLCanvasElement>(null); const [player,setPlayer] = useState<IPlayer>(); const setPosition = (newPos) => { console.log(player); // <--- player is undefined on mousemove }; useEffect(() => { canvas = canvasRef.current; ctx = canvas.getContext('2d'); canvas.addEventListener('mousemove',(e: MouseEvent) => { setPosition(getCursorPosition(canvas,e)); }); },[]); return ( <canvas ref={canvasRef} styleName="canvas" /> ); } 的定义中,specialStackdependent name;取决于类型模板参数stack<T> T

解决此问题的常用方法是为特定specialStack的基类stack专业化定义实用程序类型别名:

T

之后,您可以通过实用程序别名调用依赖基类类型class specialStack : public stack<T> { // stack<T> is a dependent name here. using Base = stack<T>; // note: this can be private,and use // solely for implementation ease. // ... }; 的成员函数

stack<T>

或者,您可以使用Base::isEmpty(); // ... Base::push(x); // ... and so on.

限定对基类成员函数的每个特定调用。
stack<T>
,

要在子类中使用父函数,您需要以这种方式指定函数的命名空间

stack<T>::isEmpty()

在子类中使用它时。

因此,代码结果如下:

#include<iostream>
using namespace std;
template<class T>
class stack {
    static const int max = 100;
    int arr[max];
    int top = -1,size = max;
public:
    void push(T x);
    T pop();
    int isEmpty();
    T topElement();
};
template<class T>
int stack<T>::isEmpty() {
    if (top == -1) return 1;
    return 0;
}
template<class T>
void stack<T>::push(T x) {
    if (top!=size) arr[++top] = x;
}
template<class T>
T stack<T>::pop() {
    if (top != -1)
    {
        return arr[top--];
    }
}
template<class T>
T stack<T>::topElement() {
    if (top != -1) return arr[top];
}
template<class T>
class specialStack : public stack<T> {
    stack<T>min;
public:
    void push(T x);
    T pop();
    T getMin();
};
template<class T>
void specialStack<T>::push(T x) {
    if (stack<T>::isEmpty()) {
        min.push(x);
        stack<T>::push(x);
    }
    else {
        T y = min.topElement();
        if (x < y)
        {
            stack<T>::push(x);
            min.push(x);
        }
        else {
            stack<T>::push(x);
            min.push(y);
        }
    }
}
template<class T>
T specialStack<T>::pop() {
    if (true)
    {
        min.pop();
        stack::pop();
    }
}
template<class T>
T specialStack<T>::getMin() {
    return min.topElement();
}
int main() {
    specialStack<int>st;
    st.push(1);
    st.push(2);
    st.push(3);
    st.push(4);
    st.push(5);
    st.push(6);
    cout << st.getMin();

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。