【问题标题】:Class inheritance but encounter redefinition error in C++类继承但在 C++ 中遇到重新定义错误
【发布时间】:2021-05-01 02:20:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • class Stackclass Stack... 你不能这样做,你只能有一个 Stack 类(无论如何都要使用这个名称)。
  • 是的,那么常见的方法是什么?我是否将Stack 定义为数组堆栈,然后将LLStack 定义为链表堆栈?这个我已经想到了,但是为同一个想法创建两个类可以吗?
  • 类不能被“重载”,如果它们被定义在同一个命名空间中,它们必须有不同的名称。
  • 我明白了。非常感谢!

标签: c++ arrays data-structures linked-list stack


【解决方案1】:

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

【讨论】:

  • 谢谢,这对我很有帮助!
猜你喜欢
  • 2020-02-06
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多