如何解决为什么在C ++中,模板类型的“ stack”类的isEmpty不继承到模板类型的派生类“ specialStack”中?
我有一个用于创建堆栈数据结构的类模板“ Stack”。另一个类模板“ specialStack”(公开继承了“ stack”类),用于以O(1)时间复杂度从堆栈中获取最小元素-getMin()可以完成此工作。
从基类继承isEmpty()时出错。它显示了isEmpty()未声明的标识符(如下面的屏幕快照所示)。我发现要解决此问题,我们必须再次重写派生类中的函数,但是如果我们在基类中有很多函数,则不可能重写所有函数。我还尝试了第二种方法,通过在派生类中使用stack
这是我的代码:-
#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" />
);
}
的定义中,specialStack
是dependent 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 举报,一经查实,本站将立刻删除。