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