Przekazanie wskaźnika dynamicznej tablicy string'ów do metody void pokaz.

0

Witam, (Niedawno zacząłem zagłębiać się w dziedzinę IT jaką jest programowanie (póki co cpp), chce utrwalić sobie tablice i wskaźniki)
Więc piszę pewien program, mimo pisania programu staram się dbać o przejrzystość i jakość pisanego kodu.

Pyt.1 Najważniejsze ! W Jaki sposób mogę przekazać moją dynamiczną tablicę stringów z metody wczytaj() do innej metody -> pokaz()?
[z int'ami znalazłem na necie, ze stringami nie mogę się doszukać dla tego piszę czy jest to w ogóle możliwe {jakieś wskaźniki ?}{może w postaci pliku ?}]

Tak przy okazji: Da się jakoś zaimplementować tablice dynamiczne w klasie ?

Pyt. 2 Liczę na jakieś uwagi dobre rady w sprawie przejrzystości kodu, jakości ? Może jakieś zmiany kosmetyczne ? Na co miałbym zwracać uwagę podczas pisania ?

W Załączniku wysyłam obrazek z Kodem:

Kanapka.h

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Kanapka
{
private:
	//Wykorzystywane przez Program
	int numer;
	int dyn_tab;

	//Podaje User
	string wybor;
	int skladnik_tab;

public:
	Kanapka(int=5, string="T", int=0, int=0);

	string antyuserTN();
	void wczytaj();
	void pokaz();

};

Kanapka.cpp

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Kanapka.h"
#include <locale.h>

using namespace std;

Kanapka::Kanapka(int skx, string w, int nr, int dt):skladnik_tab(skx),wybor(w),numer(nr),dyn_tab(dt){}

string Kanapka::antyuserTN() //AntyUser T/N
{
		do{
			cout << "[T/N]:"; cin>>wybor;

		}while(wybor!="N"&&wybor!="T");
		return wybor;
}

void Kanapka::pokaz(string sklad_tab[], int tab_ilo[]) // W jaki sposób je tutaj odtworzyć ?
{
		for(int i=0;i<=numer;i++)
		{
			cout<<"Skladnik" << i + 1 << " : " << sklad_tab[i] << " ilość: " << tab_ilo[i] << endl;
		}
}
void Kanapka::wczytaj()
{

	int *tablica_ilosc = new int [dyn_tab];
		string *skladnik_tablica = new string [skladnik_tab];
	
	do{
		
		cout << "Podaj skladnik " << numer + 1 << ": "; cin >> skladnik_tablica[numer];
		cout << "Podaj ilosc dla skladnika: " << numer + 1 << ": "; cin >> tablica_ilosc[numer];
		cout << "Czy chcesz podać kolejny składnik ";

		Kanapka::antyuserTN();

		numer++;
	}while(wybor!="N");
		numer--;

		Kanapka::pokaz(skladnik_tablica, tablica_ilosc); // Co mam dokładnie przekazac ? W jaki sposób ?

}

main.cpp

#include "stdafx.h"
#include <iostream>
#include "Kanapka.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Kanapka k;
	k.wczytaj();
	return 0;
}
2

Zasada nr 1: Ile razy Twoje palce wklepały new[], tyle raz mają wklepać delete[]. Widzę 2x to pierwsze i ani jednego tego drugiego. Wyciek pamięci jak ta lala.
Niestety istnieją wyjątki do tej reguły, więc najlepiej tak pisać kod, by ani razu nie wklepać new[].

void Kanapka::pokaz(string* sklad_tab, int* tab_ilo)

Nie masz tablicy, tylko wskaźnik do ciągłego obszaru pamięci z tymi obiektami.
A najlepiej to korzystać z std::vector i nie bawić się żadnymi wskaźnikami ani new[].

0

Właśnie liczyłem na taką odpowiedź wiedziałem że w ferworze walki czegoś zapomniałem w takim razie szybko wlecą delete[]. Przekazanie Wskaźników. I Po dokończeniu programu...pokieruje się w strone nauki i zrozumienia std::vector.

0

Witam, w ramach pytania kolejny problem znalazłem bo chciałbym by metoda wczytaj nie wykonywała metody pokaz.
Ale nadal przekazywała do niej wskaźniki swoich tablic ! Jest to w ogóle możliwe ?
Wczytaj ma służyć tylko do wczytania tablicy. Potem main.cpp by wywołał pokaz. A nie ze pokaz wywołuje we wczytaj.
Może źle piszę kod ?

0

Albo klasa zapamiętuje te 2 wskaźniki, albo wczytaj zwraca te 2 rzeczy jako struktura lub std::pair.

0

Czyli mógłbym przekazać te 2 tablice w postaci wskaźniki do klasy ? Z jakiejś metody np. Tablice ? I potem reszta metod w tej klasie by to widziała ?

Ja sobie Poradziłem z tym inaczej :P Po prostu stworzyłem metodę główną i ona zawierała tablicę. (ale wolał bym twój sposób przerobić mimo wszystko)

void Kanapka::build()
{
    int *tablica_ilosc = new int [dyn_tab];
        string *skladnik_tablica = new string [skladnik_tab];
 
		Kanapka::load(skladnik_tablica, tablica_ilosc);
        Kanapka::show(skladnik_tablica, tablica_ilosc);
		Kanapka::edit(skladnik_tablica, tablica_ilosc);
		Kanapka::end_show(skladnik_tablica, tablica_ilosc);
}

Wiec jak przekazać bezpośrednio do klasy wskaźniki z metody ? Mógłbyś wytłumaczyć/napisać ?

Program zaraz kończę to sobie Pair wpiszę do poczytania.

1
struct foobar
{
    std::string* foo;
    int* bar;
};
....
foobar wczytaj()
{
    ....
    foobar arrayPointers = { skladnik_tablica, tablica_ilosc };
    return arrayPointers;
}
...
void pokaz(const foobar& arrayPointers)

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