Re: Strings with Templates not working?
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.
};
int counter;
TKnoten *kopf;
public:
ListT();
virtual ~ListT();
void add(T element);
//void remove(T element);
T get(int i);
};
template <class T>
ListT<T>::ListT() {
counter = 0;
kopf = new TKnoten();
kopf->next = 0;
}
template <class T>
ListT<T>::~ListT() {
while (kopf->next != 0) {
TKnoten *previous = new TKnoten();
previous = kopf;
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?
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?
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?
return daten;
}
What's wrong with string as type? I'm using Linux with gcc (g++),
Nothing is wrong with string as type. Several things are wrong with
your program, however. The main thing I'd look closely into would
be the 'delete iterator' in the 'get' member function.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask