<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem templaty</title>
<link>https://forum.pasja-informatyki.pl/tag/templaty</link>
<description>Powered by Question2Answer</description>
<item>
<title>C++ templaty. Różne typy danych w liście.</title>
<link>https://forum.pasja-informatyki.pl/385967/c-templaty-rozne-typy-danych-w-liscie</link>
<description>

&lt;p&gt;Cześć,
&lt;br&gt;
W ramach odświeżenia wiedzy na temat tworzenia listy i zaznajomienia się z templatami postanowiłem połączyć te 2 rzeczy i stworzyć listę na templatach. Ogólnie wyszło OK, jeszcze nie przychodzi mi wszystko intuicyjnie, ale obyło się bez większych problemów. Piszę ten post odnośnie dwóch spraw:
&lt;br&gt;
1) Ocena kodu. Czego nie powinienem robić? Co można poprawić?&amp;nbsp; Czy konceptualnie projekt jest poprawny? Konwencja pisowni jest poprawna?&amp;nbsp;To tylko taki teaser, planuję dodać kilka przydatnych funkcji, ale zanim to zrobię, chcę się upewnić, że idę w dobrym kierunku.
&lt;br&gt;
2) Chciałbym za pomocą takiej listy zrobić zrobić np. Strukturę &quot;Książka&quot;, która będzie przechowywała listę jej parametrów&amp;nbsp;jak np. Tytuł jako łańcuch znaków, ID jako liczbę całkowitą itp. Niestety w chwili obecnej nie mogę stworzyć listy, która nie będzie miała z góry określonego typu. Mogę zrobić listę int'ów, która przechowa mi np. cenę i ID, ale już tytułu tam nie wrzucę i vice versa.&amp;nbsp;Da się to jakoś obejść? Może istnieje jakieś inne podejście niż templata w takim wypadku?
&lt;br&gt;

&lt;br&gt;
Poniżej wrzucam kod:
&lt;br&gt;
Plik nagłówkowy:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot; title=&quot;Plik nagłówkowy&quot;&gt;
#pragma once
#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

template &amp;lt;class T&amp;gt;
class Element //AKA Node
{
private:
	Element&amp;lt;T&amp;gt; *next;
	char * name; //name of our data container
	T value;    //stored value
public:
	Element(const char *_name, T _value, Element&amp;lt;T&amp;gt; *_next);
	~Element();
	const char * getName();
	T getValue();
	void setName(const char *_name);
	void setValue(T _value);
	void setNext(Element&amp;lt;T&amp;gt; *_next);
	Element&amp;lt;T&amp;gt;* getNext();
	void deleteElement();
};

template &amp;lt;class T&amp;gt;
class ElementList
{
private:
	Element&amp;lt;T&amp;gt; *head;
public:
	ElementList();
	~ElementList();
	void addElement(const char *name, T value);
	void deleteList();
	void printList();
};&lt;/pre&gt;



&lt;p&gt;Plik źródłowy + test
&lt;br&gt;
&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot; title=&quot;Plik źródłowy + test&quot;&gt;
#include &quot;pch.h&quot;
#include &quot;LinkedList.h&quot;


using namespace std;

template &amp;lt;class T&amp;gt;
Element&amp;lt;T&amp;gt;::Element(const char *_name, T _value, Element&amp;lt;T&amp;gt; *_next)
{
	setName(_name);
	value = _value;
	setNext(_next);
}

template &amp;lt;class T&amp;gt;
Element&amp;lt;T&amp;gt;::~Element()
{
	deleteElement();
	delete this;
}

template &amp;lt;class T&amp;gt;
const char *Element&amp;lt;T&amp;gt;::getName()
{
	return name;
}

 template &amp;lt;class T&amp;gt;
T Element&amp;lt;T&amp;gt;::getValue()
{
	return value;
}

template &amp;lt;class T&amp;gt;
void Element&amp;lt;T&amp;gt;::setName(const char *_name)
{
	delete[] name; //better safe than sorry
	name = new char[strlen(_name) + 1]; //let's allocate some memory for our string
	strcpy_s(name, strlen(_name) + 1, _name); //time to copy
}

template &amp;lt;class T&amp;gt;
void Element&amp;lt;T&amp;gt;::setValue(T _value)
{
	if (isdigit(_value))
		value = _value;
	else //if inserted value is not a digit, it's apparently a string of characters
	{
		delete[] value;
		value = new char(strlen(_value) + 1);
		strcpy_s(value, strlen(_value) + 1, _value);
	}
}

template &amp;lt;class T&amp;gt;
void Element&amp;lt;T&amp;gt;::setNext(Element&amp;lt;T&amp;gt; *_next)
{
	next = _next;
}

template &amp;lt;class T&amp;gt;
Element&amp;lt;T&amp;gt;* Element&amp;lt;T&amp;gt;::getNext()
{
	return next;
}

template &amp;lt;class T&amp;gt;
void Element&amp;lt;T&amp;gt;::deleteElement()
{
	delete[] name;
	//if (!isdigit(value))
		//delete[] value;
}


/*List's methods from now on*/

template &amp;lt;class T&amp;gt;
ElementList&amp;lt;T&amp;gt;::ElementList()
{
	head = nullptr;
}

template &amp;lt;class T&amp;gt;
ElementList&amp;lt;T&amp;gt;::~ElementList()
{
	deleteList();
}

template &amp;lt;class T&amp;gt;
void ElementList&amp;lt;T&amp;gt;::addElement(const char *name, T value)
{
	if (!head) //No elements in the list
	{
		head = new Element&amp;lt;T&amp;gt;(name, value, nullptr);
	}
	else //Allright, list is not empty, thus we're throwing the element to the last position
	{
		Element&amp;lt;T&amp;gt; *current = head;
		while (current-&amp;gt;getNext())
		{
			current = current-&amp;gt;getNext();
		}
		Element&amp;lt;T&amp;gt; *temp = new Element&amp;lt;T&amp;gt;(name, value, nullptr);
		current-&amp;gt;setNext(temp);

	}
}

template &amp;lt;class T&amp;gt;
void ElementList&amp;lt;T&amp;gt;::deleteList()
{
	if (!head-&amp;gt;getNext() &amp;amp;&amp;amp; head) //just one element in the list
		head-&amp;gt;deleteElement();
	else if (head-&amp;gt;getNext()) //more then one element in the list
	{
		Element&amp;lt;T&amp;gt; *current = head-&amp;gt;getNext();
		Element&amp;lt;T&amp;gt; *previous = head;
		while (current)
		{
			previous-&amp;gt;deleteElement();
			previous = current;
			current = current-&amp;gt;getNext();
		}
		previous-&amp;gt;deleteElement();
	}
}

template &amp;lt;class T&amp;gt;
void ElementList&amp;lt;T&amp;gt;::printList()
{
	Element&amp;lt;T&amp;gt; *current = head; //Just to keep track
	while (current-&amp;gt;getNext())
	{
		cout &amp;lt;&amp;lt; current-&amp;gt;getName() &amp;lt;&amp;lt; endl;
		cout &amp;lt;&amp;lt; current-&amp;gt;getValue() &amp;lt;&amp;lt; endl;
		cout &amp;lt;&amp;lt; endl;
		current = current-&amp;gt;getNext();
	}
	cout &amp;lt;&amp;lt; current-&amp;gt;getName() &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; current-&amp;gt;getValue() &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; endl;
}


int main()
{
	ElementList&amp;lt;double&amp;gt; Book1;
	Book1.addElement(&quot;Price in zl&quot;, 28.50);
	Book1.addElement(&quot;ID&quot;, 12345);
	Book1.addElement(&quot;Height&quot;, 15.3);
	Book1.addElement(&quot;Width&quot;, 8.4);
	//Book1.addElement(&quot;Title&quot;, &quot;C++ programming&quot;);//I'd like it to work this way as well
	Book1.printList();
}&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/385967/c-templaty-rozne-typy-danych-w-liscie</guid>
<pubDate>Sat, 13 Oct 2018 08:00:11 +0000</pubDate>
</item>
</channel>
</rss>