kopiowanie jednej tablicy do drugiej w klasie

0

Mam klasę Ściana figury (Face), do funkcji addFace(...) przekazuję m. in. tablicę obiektów reprezentujących wierzchołki tej ściany (Vertex v[]), w funkcji addFace() chciałbym przypisać do zmiennej prywatnej Vertex vertices[] tablicę przekazaną do funkcji. Ale nie mogę przecież dać jako zmiennej prywatnej Vertex vertices[] bez podania rozmiaru - jak rozwiązać ten problem żeby jakoś dało przypisać do zmiennej prywatnej tablicę ?

class Face
{
	public:
		Face(void);
		~Face(void);

		void addFace(Vertex v[], float a1, float a2, float a3);

	private:
		Vertex vertices[]; //ale nie znam rozmiaru przeciez
		float x, y, z;
};

void Face::addFace(Vertex v[], float a1, float a2, float a3)
{
	memcpy(vertices, v, sizeof(v));
	x = a1;
	y = a2;
	z = a3;
}
 
0

A nie możesz tej tablicy prywatnej alokować dynamicznie?
Nie wiem jak jest w C++, ale sizeof(v) chyba Ci nie zwróci tego, co chcesz.

0

Użyj wskaźnika i alokuj sobie pamięć (trzymaj też gdzieś rozmiar).
A może użyj std::vector? Czy może zbyt wolny będzie? (Testowałeś? Pamiętaj, że jest coś takiego jak .reserve(), .resize(), std::swap(), std::copy() itd)

0

No niby mógłbym użyć wskaźnika i alokować pamięć tylko biorąc pod uwagę, że wskaźniki wskazują na obszar pamieci to będę musiał potem robić tak:

[code]
Face face[6];

Vertex v[2];
v[0].setCoordinates(0.0, 0.0, -1.0, -1.0, 1.0);
v[1].setCoordinates(1.0, 0.0, 1.0, -1.0, 1.0);
face[0].addFace(v, 0.0, 0.0, 0.5); //wyslanie do funkcji
[/code]

i teraz nie moge zrobic ponownego przypisania do v[0] i v[1] bo stracę dane wiec musze stworzyc nowy obiekt z inną nazwą Vertex v1, potem Vertex v3 itd. - trochę niewygodne.

0

Nie, nie, nie, nie. Nie zrozumieliśmy się. W klasie zamiast tablicy prywatnej twórz wskaźnik, a w metodzie alokuj na niego obszar pamięci o wielkości zależnej od ilości elementów w przekazywanej argumentem tablicy i wtedy kopiuj. Pamiętaj o zwalnianiu pamięci.

0

BTW, wektor naprawdę Ci tu ułatwi życie, więc się zastanów czy nie lepiej jego tu użyć. Do alokacji będziesz potrzebował ilość elementów zapisanych w tablicy, a tego nie wyciągniesz przez sizeof(), ani żadną inną magiczną funkcję. Musisz albo tą tablicę opakować w strukturę zawierającą informacje o wielkości i/lub zajętości i przekazywać ją, albo do metody przekazywać jeszcze jeden argument zawierający ilość elementów do przetworzenia, albo w tablicy wstawiać jakiś znacznik określający jej koniec (np. tak, jak to robi '\0' w łańcuchach znaków). Tak czy siak, bez zmiany w kodzie się nie obejdzie.

0

Dzieki - mieliscie racje - vector rozwiazal wszystkie problemy - dzieki :)

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