Statický zásobník pomocí třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Statický zásobník pomocí třídy – C / C++ – Fórum – Programujte.comStatický zásobník pomocí třídy – C / C++ – Fórum – Programujte.com

 

Michal
~ Anonymní uživatel
683 příspěvků
5. 4. 2013   #1
-
0
-

Ahoj , mám za úkol implementovat třídu zásobník a třídu televize, v mainu mám naplnit zásobník jednotlivými instancemi třídy televize. Nějaký kod jsem zplodil, ale nevím jestli je to dobře. Byl bych rád za každou radu.

Hlavičkové soubory:

http://pastebin.com/jZ0NBr9s

http://pastebin.com/Kr1hGQmp

#include<iostream>
#include "televize.h"
#include "stack.h"


using namespace std;

int main(void)
{
	Televize t1;
	Televize t2;
	Televize t3;
	Stack s1;
	s1.Push(s1,t1);
	s1.Push(s1,t2);
	s1.Pop(s1);
	s1.Push(s1,t2);

	return 0;
}
Nahlásit jako SPAM
IP: 94.113.213.–
nergal+1
Návštěvník
6. 4. 2013   #2
-
0
-

má to dáky skrytý význam, že zásobníku ako prvý argument pri všetkých metódach predávaš inštanciu triedy?

ak to nemmá hlbší skytý význam tak by som to skúsil takto:

void Stack::Push(Televize t)
{
        if(IsFull(*this) != true)
        {
                Data[pointer++] = t;
        }
        else
                cout << "\n\nZasobnik je plny!\n\n";
}
 

prípadne aj isFull(stack &s) má argument ktorý vôbec nevyužíva tak ho odstrániť :)

Nahlásit jako SPAM
IP: 85.135.139.–
viem že neviem čo viem
vitamin+8
Grafoman
6. 4. 2013   #3
-
0
-

Ten tvoj zasobnik by mohol vyzerat takto:

#include <stdexcept>
template <class T, size_t N>
class Stack
{
        private:
                T data[N];
                size_t pointer;
 
        public:
                Stack():pointer(0){}
                bool IsEmpty(){return (pointer == 0);}
                bool IsFull(){return (pointer == N);};
                void Push(const T& t){
			if(IsFull())throw std::logic_error("Zasobnik je plny!");
					
			data[pointer++] = t;	
		}
                T Pop(){
			if(IsEmpty())throw std::logic_error("Zasobnik je prazdny!");
					
			return data[--pointer];
		}
 
};
int main(void)
{
	Televize t1;
	Televize t2;
	Televize t3;
	Stack<Televize, 3> s1;
	s1.Push(t1);
	s1.Push(t2);
	s1.Pop();
	s1.Push(t2);

	return 0;
}
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Michal
~ Anonymní uživatel
683 příspěvků
6. 4. 2013   #4
-
0
-

#3 vitamin
Díky moc za reakce, ohledně použití template a  knihovny stdexcept, jsem se ještě nesetkal, ale snad jsem to pochopil.

Nahlásit jako SPAM
IP: 94.113.213.–
Michal
~ Anonymní uživatel
683 příspěvků
6. 4. 2013   #5
-
0
-

#2 nergal
Žádný význam to nemá, ale myslel jsem si, že to bude lepší, když to takhle udělám. Dám na tvoji radu a odstraním to. Díky moc.

Nahlásit jako SPAM
IP: 94.113.213.–
vitamin+8
Grafoman
6. 4. 2013   #6
-
0
-

#4 Michal
stdexcept je tam len kvoly vynimke std::logic_error.

Ak sa ti nechce implementovat vlastny stack, tak mozs pouzit adapter std::stack.

#include <stack>
#include <iostream>

int main(){
    std::stack<int> stack;	//alebo std::stack<int, std::vector<int>> stack;

    stack.push(1);
    stack.push(2);
    stack.pop();
    stack.push(3);

    std::cout << stack.top();
}

Ja som si uz raz implementoval stack ktory pouziva polia, kludne ho mozes pouzit ak chces:

#include <iostream>
#include <algorithm>
#include <initializer_list>
#include <type_traits>


template <class T, size_t N>
class stack final{
	template <typename, size_t>
	friend class stack;
	
	public:
		typedef T value_type;
		typedef T& reference;
		typedef const value_type& const_reference;
		typedef T* pointer;
		typedef const T* const_pointer;
		
	private:
		char data[sizeof(value_type)*N];
		size_t pos;
		
		inline pointer t_data(size_t i){return reinterpret_cast<pointer>(data) + i;}
		inline const_pointer t_data(size_t i)const{return reinterpret_cast<const_pointer>(data) + i;}
		
	public:
		stack():pos(0){}
		
		stack(size_t n){
			pos = std::min(N, n);
			for(size_t i = 0; i < pos; ++i)
				new(t_data(i)) value_type();
		}
		
		stack(size_t n, const_reference t){
			pos = std::min(N, n);
			for(size_t i = 0; i < pos; ++i)
				new(t_data(i)) value_type(t);
		}
		
		template <class U, size_t M>
		stack(const stack<U, M>& s){
			pos = std::min(N, s.pos);
			for(size_t i = 0; i < pos; ++i)
				new(t_data(i)) value_type(*s.t_data(i));
		}
		
		template <class U, size_t M>
		stack(stack<U, M>&& s){
			pos = std::min(N, s.pos);
			for(size_t i = 0; i < pos; ++i)
				new(t_data(i)) value_type(std::move(*s.t_data(i)));
		}
		
		template <class I>
		stack(I beg, I end){
			for(pos = 0; (beg != end) && (pos < N); ++beg, ++pos)
				new(t_data(pos)) value_type(*beg);
		}
		
		stack(std::initializer_list<T>&& inic_list){
			auto beg = std::begin(inic_list);
			auto end = std::end(inic_list);
			for(pos = 0; (beg != end) && (pos < N); ++beg, ++pos)
				new(t_data(pos)) value_type(std::move(*beg));
		}

		~stack(){
			if(!std::is_trivial<value_type>::value)
				for(size_t i = pos; i > 0; --i)
					t_data(i-1)->~value_type();
		}
		
		void clear(){
			if(!std::is_trivial<value_type>::value)
				for(; pos > 0; --pos)
					t_data(pos-1)->~value_type();
			pos = 0;
		}
			
		size_t size()const{return pos;}
		constexpr size_t max_size()const{return N;}
		bool empty()const{return (pos == 0);}
		bool full()const{return (pos == N);}
		
		template <class U>
		void push(const U& u){
			new(t_data(pos)) value_type(u);
			++pos;
		}
		
		template <class U>
		void push(U&& u){
			new(t_data(pos)) value_type(std::move(u));
			++pos;
		}
		
		template <class... Args>
		void emplace(Args... args){
			new(t_data(pos)) value_type(args...);
			++pos;
		}
		
		void pop(){
			--pos;
			t_data(pos)->~value_type();
		}
		
		const_reference top(){
			return *t_data(pos-1);
		}	
};
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Michal
~ Anonymní uživatel
683 příspěvků
6. 4. 2013   #7
-
0
-

#6 vitamin
Aha, díky moc za objasnění. 

Nahlásit jako SPAM
IP: 94.113.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 94 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý