gpt4 book ai didi

c++ - 模板链接列表编译错误

转载 作者:太空宇宙 更新时间:2023-11-04 13:45:26 25 4
gpt4 key购买 nike

<分区>

我正在为学校开发一个程序。它是一个使用模板的链接列表。

我有一个抽象基类:

#pragma once
#include <string>

using namespace std;

template<class T>
class LinkedListInterface
{

public:

LinkedListInterface(void){};
virtual ~LinkedListInterface(void){};


virtual void insertHead(T value) = 0;


virtual void insertTail(T value) = 0;


virtual void insertAfter(T value, T insertionNode) = 0;


virtual void remove(T value) = 0;


virtual void clear() = 0;


virtual T at(int index) = 0;


virtual int size() = 0;

};

我从中派生了一个类:

/* Linklist.h
*
* Created on: Oct 4, 2014
*
*/

#ifndef LINKLIST_H_
#define LINKLIST_H_

#include <iostream>
#include "LinkedListInterface.h"

template<class T>
class Linklist: public LinkedListInterface<T> {
private:
struct _node
{
T val;
Linklist *next;
};
struct _node node ;
Linklist *root = NULL;
Linklist *tail = NULL;
int _size = 0;
int finddup(T value);
public:
Linklist();
virtual ~Linklist();


void insertHead(T value);
void insertTail(T value);


void insertAfter(T value, T insertionNode);


void remove(T value);


void clear();


T at(int index);


int size();

};

#endif /* LINKLIST_H_ */

链表.cpp

 /*
* Linklist.cpp
*
* Created on: Oct 4, 2014
*
*/

#include "Linklist.h"

template<class T>
Linklist<T>::Linklist()
{
// TODO Auto-generated constructor stub

}

template<class T>
Linklist<T>::~Linklist()
{
// TODO Auto-generated destructor stub
}

template<class T>
int Linklist<T>::finddup(T value)
{
Linklist *tmp = root;

while (tmp)
{
if (tmp->node.val == value)
{
return 1;
}
}

return 0;
}


template<class T>
void Linklist<T>::insertHead(T value)
{
Linklist *tmp = root;

if (finddup(value))
{
return;
}
else
{
if (!root)
{
root = new Linklist<T>();
root->val = value;
root->next = NULL;
tail = root;
_size++;
}
else
{
Linklist *newr = new Linklist<T>();
newr->node.val = value;
newr->node.next = root;
root = &newr;
_size++;
}
}

}


template<class T>
void Linklist<T>::insertTail(T value)
{
Linklist *tmp = root;

if (finddup(value))
{
return;
}
else
{
if (!tail)
{
tail = new Linklist<T>();
tail->val = value;
tail->next = NULL;
root = tail;
_size++;
}
else
{
Linklist *newr = new Linklist<T>();
newr->node.val = value;
newr->node.next = NULL;
tail->node.next = &newr;
tail = &newr;
_size++;
}
}

}


template<class T>
void Linklist<T>::insertAfter(T value, T insertionNode)
{

if (finddup(value))
{
return;
}
else
{
Linklist *tmp = root;
while (tmp)
{
if (tmp->node.val == insertionNode)
{
Linklist *newr = new Linklist<T>();
newr->node.val = value;
newr->node.next = tmp->node.next;
tmp->node.next = &newr;
_size++;
break;
}
else
tmp = tmp->node.next;
}
}
}


template<class T>
void Linklist<T>::remove(T value)
{
Linklist *prev = NULL, *active = NULL;

if (!root)
std::cout << "List is empty" << std::endl;
else
{
if (root && root->node.val == value)
{
Linklist *t = root;
root = t->node.next;
delete t;
_size--;
}
}
prev = root;
active = root->node.next;
while (active)
{
if (active->node.val == value)
{
prev->node.next = active->node.next;
delete active;
_size--;
active = prev->node.next;
}
else
{
prev = active;
active = active->node.next;
}
}

}


template<class T>
void Linklist<T>::clear()
{
Linklist *t = root;
while (t)
{
t = root->node.next;
delete root;
root = t;
}
root = NULL;
tail = NULL;
_size = 0;

}


template<class T>
T Linklist<T>::at(int index)
{
Linklist *t = root;

if (index < _size)
{
for (int i = 0; i < _size; i++)
{
t = t->node.next;
}
}
else
{
t = NULL;
}

return (t);

}


template<class T>
int Linklist<T>::size()
{
return (_size);
}

这些似乎还可以。问题是当我尝试在提供并修改的工厂类中创建 Linklist 对象时。

 #include "Factory.h"

#include "Linklist.h"



//You may add #include statements here

/*

You will MODIFY THIS DOCUMENT.

*/

/*

getLinkedListInt() and

Creates and returns an object whose class extends LinkedListInterface.

This should be an object of a class you have created.

Example: If you made a class called "LinkedList", you might say, "return new LinkedList<int>();".

*/

LinkedListInterface<int> * Factory::getLinkedListInt()
{

return new Linklist<int>();

}



/*
getLinkedListString() and

Creates and returns an object whose class extends LinkedListInterface.

This should be an object of a class you have created.

Example: If you made a class called "LinkedList", you might say, "return new LinkedList<string>();".

*/

LinkedListInterface<string>* Factory::getLinkedListString()
{

return new Linklist<string>();

}

有人告诉我:

 undefined reference to `Linklist<int>::Linklist()'

undefined reference to `Linklist<string>::Linklist()'

当我编译时。我对模板的理解不够深入,不知道我搞砸了什么。

有人有什么建议吗?

谢谢

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com