【发布时间】:2011-06-28 15:03:53
【问题描述】:
我一直在为一个关于如何在 C++ 中创建通用链表的相当简单的问题而苦苦挣扎。该列表应该能够包含多种类型的结构,但每个列表将仅包含一种类型的结构。当我想实现 getNode() 函数 [见下文] 时,问题就出现了,因为我必须指定它应该返回哪个结构。我试图用类替换结构,其中 getNode 函数返回一个由所有其他类继承的基类,但它仍然不能解决问题,因为编译器不允许 getNode 函数返回除然后是基类。
所以这里有一些代码sn-p:
typedef struct struct1
{
int param1;
(...)
} struct1;
typedef struct struct2
{
double param1;
(...)
} struct2;
typedef struct node
{
struct1 data;
node* link;
} node;
class LinkedList
{
public:
node *first;
int nbrOfNodes;
LinkedList();
void addNode(struct1);
struct1 getNode();
bool isEmpty();
};
LinkedList::LinkedList()
{
first = NULL;
nbrOfNodes = 0;
}
void LinkedList::addNode(struct1 newData)
{
if (nbrOfNodes == 0)
{
first = new node;
first->data = newData;
}
else
{
node *it = first;
for (int i = 0; i < nbrOfNodes; i++)
{
it = it->link;
}
node *newNode = new node;
newNode->data = newData;
it->link = newNode;
}
nbrOfNodes++;
}
bool LinkedList::isEmpty()
{
return !nbrOfNodes;
}
struct1 LinkedList::getNode()
{
param1 returnData = first->data;
node* deleteNode = first;
nbrOfNodes--;
if (nbrOfNodes)
first = deleteNode->link;
delete deleteNode;
return returnData;
}
所以问题,一句话,如下:如何调整上面的链表类,使其也可以用于struct2,而不必为struct2对象创建一个几乎相同的新列表类?正如我上面所说,LinkedList 的每个实例只会处理 struct1 或 struct2。 感谢提示或帮助
【问题讨论】:
-
要么对其进行模板化,要么将节点指针设为 void* - 只要将它们取出的代码知道它们是,就没有理由需要特定类型 - 你可以直接转换。
标签: c++ struct linked-list