System::Collections::Generic::List::Add() - skopiuje, czy przestawi wskaźnik?

0

Witam.

Piszę w zarządzanym C++. Mam pewną wątpliwość co do tego, jak działa dokładnie lista w C++.

Piszę konstruktor kopiujący do jednej klasy i ważne jest dla mnie, by był on faktycznie kopiujący. Klasa zawiera List<A^>^ a (A to inna klasa, którą mam). Konstruktor kopiujący ma oczywiście deklarację:

B(const B% b);

Pytanie, czy jeżeli w środku dam:

a = gcnew List<A^>();

for(int i = 0; i < 3; i++) //3 - tyle dokładnie jest tam elementów. Zawsze.
{
	a->Add(b.a[i]);
}

to czy wtedy zostaną te wartości skopiowane, czy tylko zostaną przestawione wskaźniki na A?

Podobnie z AddRange:

a = gcnew List<A^>();

a->AddRange(b);
0

najważneijszym pytaniem jest, co to jest to Twoje A?
czy jest to ref-class czy value-class?
Większość zachowania się zalezy od tego.
ref-class bedzie z definicji zawsze przekazaniem przez wskaznik/referencje na oryginal, nie ważne czy o^kujesz to czy nie.
value-class z kolei bedzie czule na okowanie. Bez bedzie przez wartosc, z ^ bedzie oboxowane i przez referencje.

Tak wiec, jezeli chcesz miec zachowanie z kopiowaniem, uzyj value-class i List<A>. Jeżeli chcesz miec przez referencje, użyj ref-class i List<A>. Co ciekawe, w przypadku generic'ow, chyba nawet nie uda Ci sie tego pomieszac, bo sugerując się http://stackoverflow.com/questions/1558620/c-cli-boxing-and-generic-lists - List<A> zostanie odrzucone przy kompilacji jesli A bedzie ref, a List<A> odrzucone gdy A bedzie value. Nie sprawdzalem, ale brzmi w 100% sensownie.

Jesli zas NIE chcesz aby Twoja klasa A byla valuetype, to jestes z SCG::List w lekkiej kropce, poniewaz, IIRC, zostaje Ci opcja ref-class i reczne kontorlowanie i pilnowanie zeby przy wrzucaniu na liste wykonywac kopiowanie.

0

Dokładnie. Czy kopiowany jest obiekt, czy uchwyt na obiekt, to widać po typie listy:

List<MojaKlasaTypuRef^>

Jest daszek, więc jest kopiowanie uchwytów. Parametr musi być ref class albo ref struct.

List<MojaKlasaTypuValue>

Nie ma daszka, więc jest kopiowanie obiektów. Parametr musi być value class albo value struct.

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