如何解决类继承但在C++中遇到重定义错误
我正在学习 C++ 数据结构,关于使用数组和链表实现堆栈。该数组是 C++ 中的默认值,但我已经构建了一个 Linked List 类。下面的代码是我的链表头文件
#pragma once
#include "Node.h"
#include "Stack.h"
class LinkedList
{
public:
LinkedList() {head = NULL;}
Node* AddNode(int index,float x,bool doubly);
int FindNodeIndex(float x);
Node* FindNodeAddress(float x);
void DeleteNode(float x);
void displayList();
private:
Node* head;
friend class Stack;
};
其中也使用了 Node 头文件,但这里不相关。然后我想同时使用数组和链表来实现堆栈。下面是我的堆栈头文件:
#pragma once
class Stack
{
public:
Stack(int size = 10);
bool IsEmpty() { return top == -1;}
bool IsFull() { return top == maxTop;}
double Top();
void Push(const double x);
double Pop();
void displayStack();
void Clear();
private:
int maxTop;
int top;
double* values;
};
class Stack: public LinkedList
{
public:
Stack(){}
double Top()
{
if (!head)
{
std::cout << "The stack is empty." << std::endl;
return -1;
}
else
return head->data;
}
void Push(const double x) {AddNode(0,x);}
void displayStack() { displayList();}
}
可以看到,在用于查找链表顶部元素的Top()方法中,使用了head
变量(或者显式地,Node的指针),其中在数组的实现中,我有相同的 Top() 方法,但它只使用索引数组。编译器给我这个错误信息
Stack.h:20:7: error: redeFinition of 'class Stack'
20 | class Stack: public LinkedList
我知道我可能在这里犯了一些错误,但我认为有必要编写两个 Stack 类,因为它们具有不同的用途,例如 Top() 方法不能用于两者。是否可以将两者结合为一个 Stack 类,然后通知编译器是使用数组还是链表?
解决方法
嗨,@Some_programmer_dude 说
类不能被“重载”,如果它们定义在同一个命名空间中,它们必须具有不同的名称。
我会在这种情况下使用多态。 所以我们定义了一个名为 Stack 的基类,然后将创建另外两个名为 LinkedListStack 和 ArrayStack 的类,它们都派生自 Stack。
// abstract class Stack
class Stack
{
public:
Stack(int size = 10);
virtual bool IsEmpty() = 0; // pure virtual function
virtual bool IsFull();
virtual double Top();
virtual void Push(const double x);
virtual double Pop();
virtual void DisplayStack();
virtual void Clear();
protected:
int maxTop;
int top;
double* values;
};
如你所见,Stack有一个成员方法virtual bool IsEmpty() = 0;
,它被称为纯虚函数,没有任何定义,这会导致我们的类成为一个抽象基类。
抽象基类是只能作为基类使用而不能被实例化的类。由于我们不想实例化一个 Stack 类,我们想实例化 LinkedListStack 或 ArrayStack。
然后对于每个派生类(LinkedListStack 和 ArrayStack),我们将定义它们的基类虚函数。
class LinkedListStack: public Stack
{
public:
LinkedListStack();
bool IsEmpty() { return !head; }
double Top()
{
if (IsEmpty())
{
std::cout << "The stack is empty." << std::endl;
return -1;
}
else
return head->data;
}
void Push(const double x) { AddNode(0,x); }
void DisplayStack() { DisplayList(); }
/* define remaining base member methods. */
}
class ArrayStack : public Stack
{
public:
ArrayStack(int size = 10);
bool IsEmpty() { return top == -1; }
bool IsFull() { return top == maxTop; }
/* define remaining base member methods. */
};
看看这个神奇的 C++ tutorial,它教授虚函数和多态性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。