Re: Strings with Templates not working?
Victor Bazarov schrieb:
Markus Pitha wrote:
Hello,
I'm using a template to simulate a LinkedList from Java.It works
without problems, but when I want to use strings in main.cpp instead
of char*, I get the following error message:
$ ./Main
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
I tried to import <string> both in main.cpp and listT.h, but the
errormsg was the same.
You have some logical errors in your code. See below.
The classes look like this:
MAIN.CPP------------------------------------------
#include "ListT.h"
#include <iostream>
using namespace std;
int main(void) {
ListT<string> *testList = new ListT<string>();
testList->add("Test1");
testList->add("Test2");
testList->add("Test3");
cout << testList->get(0) <<endl;
cout << testList->get(1) <<endl;
cout << testList->get(2) <<endl;
delete testList;
return 0;
}
------------------------------------------------
LISTT.H-----------------------------------------
template <class T> class ListT {
private:
struct TKnoten {
T daten;
int index;
TKnoten *next;
The 'TKnoten' struct is not a POD, which means that upon its
default-initialisation both 'index' and 'next' contain garbage.
You should write a default c-tor which will initialise 'index'
to something specific, like -1, and 'next' to NULL.
Ok.
Take a close look at the previous two statements. You create
a new 'TKnoten' object, obtain a pointer to it and IMMEDIATELY
lose it by overriding the value in 'previous'. Do you really
need to create a new 'TKnoten' here while deleting your list?
I have an old C book. They write the following in this book:
free(head);
head = head->next;
I thought this can not work, because how can I free the "head" of the
list _at first_ without losing the whole list?
kopf = kopf->next;
delete previous;
}
delete kopf;
}
template <class T>
void ListT<T>::add(T element) {
TKnoten *newKnoten = new TKnoten();
newKnoten->next = kopf;
kopf = newKnoten;
kopf->daten = element;
kopf->index = counter;
counter++;
}
template <class T>
T ListT<T>::get(int i) {
TKnoten *iterator = new TKnoten();
HUH? Why are you creating another 'TKnoten' here?
How can I iterate over the whole list then without an extra object?
T daten = 0;
iterator = kopf;
Again, you're immediately losing the value of 'iterator' that you
just obtained from 'new'...
while (iterator->next != 0) {
if (iterator->index == i) {
daten = iterator->daten;
}
iterator = iterator->next;
}
delete iterator;
Are you sure you need to 'delete' it here?
I thought that I have to delete everything I allocated with "new"?
Markus