c++ stos obiektowo

0

Witam chce zrobić stos obiektowo (dopiero sie ucze obiektówki wiec prosze o wyrozumiałość )
chce wywołać metode empty dla obiektu s1 i wyskakuje mi błąd error C2228: po lewej ".empty" musi być typ struct/union
dziekuje za pomoc

#include<iostream>
const int stala = 11;
using namespace std;

class Stos
{	
public:
	int w, liczba ;
	int tablica[stala]; //w ->wierzcholek


	Stos( int tablica[]) //init
	{
		int w = 0;
	
	}
public:
	int push(int liczba, int tablica[])
	{
		if (w >= 10) //stos pelny
			return 0;
		else
		{
			cin >> liczba;
			w =w + 1;
			tablica[w] = liczba;

		}
	}
	int pop( int  w, int tablica[])
	{
		if (w == 0) //stos pusty
			return 0;
		else
		{
			w = w - 1;
		}
	}
	int top( int w, int tablica[])
	{
		if (w == 0)
			return 0;
		else if (w > 0)
			cout<< tablica[w]<<endl;
	}
	void empty()
	{
		if (w == 0)
			cout << "true" << endl;
		else cout << "false" << endl;
	}
	void full( int w) 
	{
		if (w == 10)
			cout << "true" << endl;
		else cout << "false" << endl;
	}
	~Stos()
	{

	}
};


int main()
{
	Stos s1();
	s1.empty();

	system("pause");
		
}
4

Złapałeś się w Most Vexing Parse. Ze względu na kompatybilność z językiem C, Stos s1() to deklaracja funkcji zwracającej Stos i przyjmującej zero argumentów.

Zamień () na {}, lub zapisz to po prostu Stos s1;

3

Konstruktor klasy Stos przyjmuje argument: int tablica[].
Definiując jakikolwiek konstruktor z argumentami automatycznie przestaje istnieć domyślny konstruktor (bez argumentów).

Poza tym, to: Stos s1(); kompilator traktuje jako deklarację funkcji. Obiekt, z konstruktora domyślnego tworzy się po prostu tak: Stos s1;.

PS. int w = 0; w konstruktorze jest źle. Tworzysz nową zmienną, i przesłaniasz składową klasy o tej samej nazwie. Było zrobić po prostu w = 0;.

0

@kq dziękuje za szybką odpowiedz lecz nie pomogło wyskakuje bład error C2512: "Stos": niedostępny odpowiedni konstruktor domyślny

0

Poprawiłeś jeden problem, zostały kolejne. Zobacz post @mwl4

1

No bo jak napisałem, definiując jakikolwiek konstruktor z argumentami automatycznie pozbywasz się domyślnego konstruktora. Aby go mieć na nowo musisz go dodać:

Stos() : w(0)
{
}
0

@mwl4: dziekuje twoje rozwiazanie działa mam jeszcze pytanie czy jak zainicjuje Stos s2 to automatycznie stworzy sie nowy obiekt z nową tablicą czy bedzie działać na tablicy s1 ?

2

http://ideone.com/rwPaSc

#include <iostream>

template<typename T, std::size_t Size = 64>
class stack {
	T data[Size];
	std::size_t elements_count = 0;
public:
	template<typename... Ty>
	stack(Ty... tys): 
		data{tys...}, 
		elements_count{sizeof...(Ty)} {}
		
	stack() {}
	
	bool empty() const {
		return elements_count == 0;
	}
	
	bool full() const {
		return elements_count == Size;
	}
	
	T pop() {
		if(empty()) {
			throw std::out_of_range("Cannot pop from empty stack");
		}
		return data[--elements_count];
	}
	
	void push(T const &value) {
		if(full()) {
			throw std::out_of_range("Cannot push to full stack");
		}
		data[elements_count++] = value;
	}
	
	auto begin() const {
		return std::begin(data);
	}
	
	auto end() const {
		return std::begin(data)+elements_count;
	}
};

int main() {
	stack<int, 3> s {1, 2, 3};
	s.pop();
	s.push(4);
	
	for(auto element: s) {
		std::cout << element << " ";
	}
	
	try {
		s.push(100);
	}catch(...) {
		std::cout << "\npushing to full stack is forbidden";
	}
	
	s.pop(); s.pop(); s.pop();
	
	try {
		s.pop();
	}catch(...) {
		std::cout << "\npopping from empty stack is forbidden";
	}
	return 0;
}
0
cinekb napisał(a):

@mwl4: dziekuje twoje rozwiazanie działa mam jeszcze pytanie czy jak zainicjuje Stos s2 to automatycznie stworzy sie nowy obiekt z nową tablicą czy bedzie działać na tablicy s1 ?

Przy tworzeniu nowego obiektu tworzą się nowe pola, czyli w twoim przypadku te zmienne:

public:
    int w, liczba ;
    int tablica[stala]; //w ->wierzcholek

utworzą się nowe dla nowego obiektu.
p.s. w większości przypadków pola ustawia się jako private, a dostęp do nich masz za pomocą publicznych metod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1