Obiektowy c++ lista obiektów

0

Dobry wieczór.
Mam problem z moim programem, który po kompilacji wysypuje się. Nie wiem, czy dobrze tworzę nowy obiekt w metodzie ostrony oraz czy mogę wywołać tą metodę w instrukcji switch. Jeśli ktoś miałby czas spojrzeć na to i znaleźć błąd byłbym wdzięczny.

Kod programu:

 #include <iostream>
#include <fstream>
#include <string>
#include <list>

using namespace std;


class Dziela
{
	string rok;
public:
	Dziela(string r):rok(r){};
};




class Strony: public Dziela
{
private:
	
	string url;
	
public:

	
	
	Strony(string _url, string rok): Dziela(rok)
	{
	url=_url;
	}
			
};





class Zarzadca
{
	private:
	string adrs;
	string roks;
	int liczs;
	int as;
	int rs;	
	
	public:
	
	list<Strony> listas;
	

	void ostrony(string linia)
	{
		liczs =2;
		as=0;
		rs=0;
		while(linia[liczs]!=',')
		{
			adrs[as]=linia[liczs];
			as++;
			liczs++;
		}
		liczs++;
		while(linia[liczs]!=';')
		{
			roks[rs]=linia[liczs];
			rs++;
			liczs++;
		}
		
		Strony pomstr(adrs,roks);
		listas.push_back(pomstr); 
		
		cout<<adrs<<roks;
	}



	
	void przyporz(string sciezka)
	{
		
		char pznak;
		string linia;
		fstream plik;
		plik.open(sciezka.c_str(),ios::in);
		if( plik.good() == true )
			{
   				while(plik.eof()==0)
				{
					getline(plik,linia);
					pznak=linia[0];
					
					switch (pznak)
					{
						case 'K':
							
							break;
						case 'C':
							
							break;
						case 'R':
							
							break;
						case 'I':
							ostrony(linia);
							break;		
					}
					
					
				} 
			}
			else 
			{
				cout<<"Brak dostepu do pliku"<<endl;
			}

			plik.close();
		
	}
};






int main() 
{

	string sciezka;
																	
	sciezka = "wej.txt";						
	
	Zarzadca pom;
	Strony pom2();

	pom.przyporz(sciezka);	
	
	return 0;
}

0
if( plik.good() == true )
{ ... }
else 
{
        cout<<"Brak dostepu do pliku"<<endl;
 }

zdecydowanie zmniejsza czytelność kodu. Lepiej zrobić coś w stylu:

if( !plik.good() )
{
        cout<<"Brak dostepu do pliku"<<endl;
        return; //lub return false jesli zmienisz zwracany typ na bool
 }

Jednak to tylko czytelność. Jednym z problemów jest linijka:

adrs[as]=linia[liczs];

W taki sposób nie da się dopisywać do napisu, ponieważ odwołanie adrs[as] wychodzi już poza zakres.

Podaj przykładowy plik, który chcesz odczytać.

Ten switch póki co jest bez sensu, ale domyślam się, że chcesz dopisać kolejne funkcje, które będą wywoływane przy literach K, C i R, tak?

0

Zmienna string linia przechowywać będzie informacje o stronach internetowych (adres i rok powstania)np.
I//www.youtube.com/?gl=PL&hl=pl,2005;
I//allegro.pl/,1999;

i tutaj też mam problem co zrobić jeśli tych stron będzie więcej zmienna adrs może przechowywać pozostałości po poprzedniej stronie , jeśli ta była dłuższa, nie mam pojęcia jak rozwiązać ten problem...

Tak, ten switch jest dla pozostałych linii w pliku w zależności od jakiej litery zaczyna się linijka, ale działanie jest takie samo jak ze stronami, więc po rozwiązaniu tego problemu reszta to będzie już czysta formalność:)

1

@mateusz2813, może lepiej tak:

if(!plik) exit(cerr<<"Brak dostepu do pliku"<<endl);
0
_13th_Dragon napisał(a):

@mateusz2813, może lepiej tak:

if(!plik) exit(cerr<<"Brak dostepu do pliku"<<endl);

Ta czytelność :)
Problem mam jednak z tworzeniem nowych obiektów i z dodawaniem ich do listy ;/

0

Mój post był adresowany nie do ciebie tylko do @mateusz2813, tobie jedynie co mogę poradzić to zacząć od jakiegoś kursu.
Kiedy zamiast zmiennych lokalnych tworzysz składowe klasy, to oznacza to tylko jedno - nie masz zielonego pojęcia co robisz.

0
	void ostrony(string linia)
	{
		
		string adrs;
		string roks;
		int liczs=2;
		int as=0;
		int rs=0;
		while(linia[liczs]!=',')
		{
			adrs[as]=linia[liczs];
			as++;
			liczs++;
		}
		liczs++;
		while(linia[liczs]!=';')
		{
			roks[rs]=linia[liczs];
			rs++;
			liczs++;
		}
		
		Strony pomstr(adrs,roks);
		listas.push_back(pomstr); 
		cout<<adrs<<roks;
	}

Zielonego pojęcia nie mam co robię źle w tej funkcji.

0
  1. sprawdź czy wiersz zawiera znaki ',' i ';'
  2. użyj string::find oraz string::substring
0

1.Tak plik na pewno zawiera te znaki.
2.Inny zapis działanie to samo.

Tak jak już pisałem wcześniej nie wiem na 100% czy dobrze tworzę nowy obiekt i dodaję go do listy(korzystam z STL-a) i drugi problem gdy będę mieć więcej linii w pliku w zmiennych zostaną pozostałości po poprzedniej linii np.

1.allegro.pl
2.you.pl
do zmiennej zapisze tylko 6 znaków a ".pl" z pierwszej linii zostanie, jest jakaś możliwość wyczyszczenia tego? zastosować dynamiczna tablice i używać delete po każdym wywołaniu funkcji?

0

Ok poradziłem sobie z tym problemem.
Rozwiązałem to w taki sposób:

	void ostrony(string linia)
	{
	
		char *adrs;
		adrs = new char[50];
		char *roks;
		roks = new char[10];
		int liczs=2;
		int as=0;
		int rs=0;
		while(linia[liczs]!=',')
		{
			adrs[as]=linia[liczs];
			as++;
			liczs++;
		}
		liczs++;
		while(linia[liczs]!=';')
		{
			roks[rs]=linia[liczs];
			rs++;
			liczs++;
		}
		
		
		Strony pomst(adrs,roks);
		
		pomst.wyps();
		
		
		
		delete [] adrs;
		delete [] roks;
 	}

Dodałem metodę do klasy Strony o nazwie wyps i wszystko ładnie się wypisuje.

Dalej jednak nie wiem gdzie przechowywać te obiekty klasy Strony. Na początku próbowałem w liście, ale dopiero zaczynam obiektówkę i do końca nie wiem jakby to miało wszystko wyglądać, gdzie ją zadeklarować itp. Jeśli znalazłaby się osoba, która mogłaby mi to wytłumaczyć byłbym wdzięczny.

0
  1. Przydzielenie pamięci o stałym rozmiarze? Doprawdy? Zwykłe char roks[10]; jest zbyt mainstreamowe?
void ostrony(const string &linia)
  {
   int pa=linia.find(',',2),pr=linia.find(';',pa),
   Strony pomst(linia.substr(2,pa-2),linia.substr(pa+1,pr-pa-1));
   pomst.wyps();
  }

człowieku, zacznij czytać podstawy!

0
_13th_Dragon napisał(a):

Przydzielenie pamięci o stałym rozmiarze? Doprawdy? Zwykłe char roks[10]; jest zbyt mainstreamowe?

Gdybym nie użył new nie mógłbym użyć delete, obiektów będzie więcej, a dzięki temu napisy nie będą się na siebie nakładały i wszystko póki co działa;)

Podstawy znam, ale dalej nie wiem gdzie "powkładać" te obiekty, co do podstaw nie należy.

0
alok123 napisał(a):

Podstawy znam, ale dalej nie wiem gdzie "powkładać" te obiekty, co do podstaw nie należy.

Następna wypowiedź:

alok123 napisał(a):

Gdybym nie użył new nie mógłbym użyć delete, obiektów będzie więcej, a dzięki temu napisy nie będą się na siebie nakładały i wszystko póki co działa;)
wyraźnie świadczy o przeciwnym.

  1. Owszem nie mógłbyś użyć delete ale kto cię do tego zmusza?
  2. "obiektów będzie więcej" a nawet miliard co to przeszkadza?
  3. "napisy nie będą się na siebie nakładały" - człowieku weź podstawy poczytaj, bo brak słów.
0

Moje rozwiązanie jest poprawne, może nie najlepsze ale poprawne.

Twój punkt 2 i 3 spójrz na prosty przykład:

	char tab[10];
	
	tab[0]= '1';
	tab[1]= '2';
	tab[2]= '3';
	tab[3]= '4';
	
	cout<<tab<<endl;
	
	tab[0]= '5';
	tab[1]= '6';
	cout<<tab;

Może do końca nie rozumiesz mojego toku myślenia, nie programuje od lat jak Ty.

0

No właśnie dla tego mówię o obowiązkowym czytaniu podstaw:

    char tab[]="1234";
    string s1(tab);
    tab[0]= '5';
    tab[1]= '6';
    string s2(tab);
    tab[2]= '8';
    tab[3]= '7';
    string s3(tab);
    cout<<s1<<' '<<s2<<' '<<s3<<endl;
0

Nie wiem co chciałeś mi pokazać tym przykładem, ale chodziło mi o to, że w moim przykładzie 3 i 4 zostają w tablicy, a dzięki new delete mogę usunąć całą tablicę i wprowadzić nowy krótszy string. Pewnie można to zrobić dużo lepiej, ale moje rozwiązanie działa, może nie jest optymalne, ale działa;). Niestety dalej nie wiem co i jak zastosować do przechowywania obiektów klasy Strony i w tym tkwi mój problem.
Jeśli zechciałbyś mi pomóc w tej kwestii byłbym wdzięczny.

0

Przykład pokazuje że nie musisz tworzyć nowych tablic, nic się nie "nakłada".
Generalnie jak tworzysz za pomocą new zaś w nawiasach kwadratowych masz stałą to tworzysz jakiś bubel.
Zacznij może od przeczytania jakiegoś kursu.

0

To dlaczego ten bubel działa ?

0

bo to jest UB. Dziala u Ciebie u mnie moze nie dzialac u trzeciego moze dzialac przez miesiac a pozniej nie dzialac

0

Co w tym złego, alokuję pamięć dla 30 elementów wpisuję tam dane, wykorzystuję je do stworzenia nowego obiektu po czym zwalniam pamięć i po ponownym wywołaniu funkcji powtarzam te czynności.

0

A co złego w obliczaniu prędkości jako: V=(S*S*S*t*t)/(S*S*t*t*t) ?
I też nic złego jak taksówkarz przewiezie cię na odległość paru kilometrów a na liczniku stówa.
No i oczywiście nic złego jak ktoś zadaje pytanie na forum zaś kiedy dostaje odpowiedź zaczyna bronić swojego nie działającego kodu na około napisanego.

0

Na pytanie gdzie przechowywać te obiekty nie otrzymałem odpowiedzi, a głównie o to mi chodzi.

0

No zgodnie z twoją ulubioną praktyką trzeba:

  1. wysłać na serwer w chmurze,
  2. serwer przekaże to do rozproszonej bazy danych,
  3. w programie odczujesz z tej bazy poprzez strumień.
0

Może jednak jakiś inny sposób ?:D hehe;p

0

Nie ode mnie, mnie już przekonałeś ...

0

Miałeś racje. Muszę wszystko pozmieniać, new tylko rezerwuje pamięć, a delete zwalnia, nie usuwa zawartościj. Gdy zrobiłem kolejne tablice np tab[4][10] i chciałem wypisac tab[1] to wypisywało mi pozostałości w tych komórkach pamięci. Muszę precyzyjnie zaalokować tyle komórek pamięci ile mi potrzeba ;)

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