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

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

如何解决类继承但在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 举报,一经查实,本站将立刻删除。