Class继承但在C++中遇到重定义错误

Class inheritance but encounter redefinition error in C++

我正在学习 C++ 数据结构,关于使用数组和链表实现堆栈。该数组在 C++ 中是默认的,但我构建了一个链表 class。下面的代码是我的链表头文件

#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的头文件,不过这里不相关。然后我想使用数组和链表来实现堆栈。下面是我的 Stack 头文件:

#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变量(或明确地,节点的指针),其中在实现数组,我有相同的 Top() 方法,但它只使用索引数组。编译器给我这个错误信息

Stack.h:20:7: error: redefinition of 'class Stack'
   20 | class Stack: public LinkedList

我知道我可能在这里犯了一些错误,但我认为有必要写两个 Stack class 因为它们有不同的目的,例如 Top() 方法不能同时用于.可不可以把两者合并为一个Stackclass,然后通知编译器是用数组还是链表?

你好@Some_programmer_dude 说

Classes can't be "overloaded", they must have different names if they are defined in the same namespace.

对于这种情况,我会使用多态性。 所以我们定义了一个名为 Stack 的基础 class,然后将创建另外两个名为 LinkedListStack 和 ArrayStack 的 classes,它们都派生自 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;,这个叫做纯虚函数,不会有任何定义,这会导致我们的class是一个abstract base class.

抽象基础classes 是classes,只能用作基础classes,不能被实例化。由于我们不想实例化 Stack class,我们想实例化 LinkedListStack 或 ArrayStack。

然后对于每个派生的 class(LinkedListStack 和 ArrayStack),我们将定义它们的基础 class 虚函数。

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,它教授虚函数和多态性。