Przekazywanie obiektu

0

Mam pewien problem, otóż przekazując obiekt do funkcji zawiesza mi program natomiast gdy przekażę referencje to juz jest ok. Sytuacja ma miejsce nawet w przypadku funcji void abc(Graf G); Przecież przekazując dane przez wartość tworzy się kopia. Ktoś może mi pomóc? Z góry dzięki :D

class GrafMacierz{
public:
	int _liczbaWierzchholkow;
	int **_macierzSasiedztwa;
	vector<Wierzcholek> _listaWierzcholkow;
	vector<Krawedz> _listaKrawedzi;
	GrafMacierz(int wierzcholki);
	~GrafMacierz();
	void wczytajGraf(string nazwa);
	void zapiszGraf(string nazwa);
	void zbuduj(int gestosc);
bool istniejeKrwedz(int i, int j);

}; 
void abc(GrafMacierz G){}

int main() {

	GrafMacierz G1(6);
abc(G1);
2

Wygoogluj sobie frazę "rule of three" albo "rule of five" (albo najlepiej "rule of zero" i nie używaj nagich wskaźników do czegoś innego niż wskazywania)

0

napisałem konstruktor i dalej nie działa.

GrafMacierz::GrafMacierz(const GrafMacierz& graf) {
	_liczbaWierzchholkow=graf._liczbaWierzchholkow;
	_macierzSasiedztwa=graf._macierzSasiedztwa;
	_listaKrawedzi=graf._listaKrawedzi;
	_liczbaWierzchholkow=graf._liczbaWierzchholkow;
}
1

No bo dalej masz double delete. Kopiujesz wskaźnik.

0

To jak mogę sobie z tym poradzić? Zrezygnować ze wskaźnika nie mogę.

1

No to musisz doprowadzić do tego, aby każdy obiekt, który w destruktorze delete'uje wskaźnik miał swoją kopię danych. Albo jak człowiek użyć smart pointera/kontenera z biblioteki standardowej.

0

Na coś takiego mogę zamienić tworzenie tablicy dynamicznej 2D?

unique_ptr<int*[]> smp_pi(new int*[_liczbaWierzcholkow]);
	for(int i=0;i<_liczbaWierzchholkow;i++){
		unique_ptr<int[]> smp_i(new int[_liczbaWierzcholkow]);
2

Nie, nie, nie.

Użyj jednowymiarowego std::vector i zrób odpowiednie funkcje dostępowe, żeby "udawać" że ma dwa wymiary.

Używanie std::unique_ptr dla tablic dynamicznych to jakaś straszna herezja. Niby się da, ale po co, skoro jest std::vector. Dodatkowo tablice wielowymiarowe polegające na wskaźnikach do wskaźników do wskaźników itd. są niemądre. Same z tym problemy. Lepiej odpowiednio używać jednowymiarowej tablicy.

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