Wektor w najlepszym podejściu do konstrukcji? C ++


Próbuję zawrzeć wektor w mojej strukturze.
Oto moja struktura:
struct Region 
{
bool hasPoly;
long size1;
long size2;
long size3;
long size4;
long size5;
long size6;
//Mesh* meshRef;// the mesh with the polygons for this region
long meshRef;
std::vector<int> PVS;
} typedef Region;

Czy wektor w tej deklaracji jest prawidłowy, czy też bardziej sensowne byłoby utworzenie wskaźnika do wektora. W przypadku wskaźnika do wektora, czy przydzielić nowy wektor. Jak mam to osiągnąć?
Podziękować!
Edycja: Problem polega na tym, że powoduje to błąd wskazujący na xmemory.h, plik będący częścią platformy MSVC ++.
void construct(pointer _Ptr, _Ty&& _Val)
{// construct object at _Ptr with value _Val
::new ((void _FARQ *)_Ptr) _Ty(_STD forward<_Ty>(_Val));// this is the line
}

Co ciekawe, nie dzieje się tak, gdy izoluję go poza strukturą i tylko w funkcji, której używam. Jakieś pomysły?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz to napisać w ten sposób bez kroju pisma:
struct Region 
{
bool hasPoly;
long size1;
long size2;
long size3;
long size4;
long size5;
long size6;
long meshRef;
std::vector<int> PVS;
};// no typedef required

Aby odpowiedzieć na Twoje pytania:

Czy wektor w tej deklaracji jest prawidłowy?

Tak to jest.

lub byłoby rozsądniej zrobić wskaźnik do wektora.

Nie, najprawdopodobniej nie. Gdyby tak było, musiałbyś zaimplementować konstruktor kopiujący, operator przypisania i destruktor dla zachowania kopiowania. Skończysz z tym samym, ale będzie to dodatkowa praca i może prowadzić do błędów.

W przypadku wskaźnika do wektora, czy przydzielić nowy wektor. Jak mam to osiągnąć?

Będziesz musiał wdrożyć

konstruktor

biurowy
, operator przypisania

kopiowanie i

burzyciel

:
// Copy constructor
Region(const Region & rhs) :
hasPoly(rhs.hasPoly),
// ... copy other members just like hasPoly above, except for PVS below:
PVS(new std::vector<int>(*rhs.PVS))
{
}// Copy assignment operator
Region & operator=(const Region & rhs)
{
if (this != &rhs)
{
hasPoly = rhs.hasPoly;
// ... copy all fields like hasPoly above, except for PVS below: delete PVS;
PVS = new std::vector<int>(*rhs.PVS);
}
return *this;
}// Destructor
Region::~Region()
{
delete PVS;
}

Konkluzja: twój kod jest w porządku. Nie musisz niczego zmieniać.
EDYCJA: Napraw operator przypisania: sprawdź porównanie z tym i zwróć * to.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ma to sens, a pod żadnym względem nie potrzebujesz
new
, chyba że chcesz utworzyć alias pojedynczego wektora. Ponadto, nie potrzebujesz tutaj nic
typedef
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To zależy od tego, jak go używasz.
Jeśli chcesz skopiować wektor i dane podczas kopiowania struktury
Region
, pozostaw je bez wskaźnika.
Jeśli nie chcesz, aby został skopiowany, potrzebujesz jakiegoś wskaźnika wektorowego.
Jeśli używasz wskaźnika do wektora, musisz bardzo uważać na bezpieczeństwo wyjątków alokacji/cofania alokacji. Jeśli nie możesz pokryć swojej alokacji w bezpieczny sposób, pozostawiasz możliwość wycieków pamięci.
Istnieje kilka opcji:
  • Upewnij się, że kod, który wybiera wektor (i używa
    Region
    ), również zwalnia wektor i sam jest bezpiecznym wyjątkiem. Wymagałoby to, aby
    Region
    istniał tylko w zakresie tego kodu. Możesz to zrobić, po prostu przydzielając wektor na stosie i przekazując go do wskaźnika w
    Region
    . Następnie upewnij się, że nigdy nie zwrócisz obiektu
    Region
    powyżej tej ramki stosu.
  • Możesz także użyć pewnego rodzaju inteligentnego wskaźnika - & > wektor w Twoim
    Region
    .
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wektor jest w porządku. Pamiętaj, że jeśli skopiujesz tę strukturę, wektor zostanie z nią skopiowany. Dlatego w kodzie z pewnymi ograniczeniami wydajności należy traktować tę strukturę tak, jak każdy inny typ kosztowny do skopiowania.
W kodzie produkcyjnym niektórzy woleliby, aby do zdefiniowania tej klasy używać słowa kluczowego
class
zamiast słowa kluczowego
struct
, tak jak robi to element członkowski
vector
to nie jest POD. Jeśli jesteś autorem własnego poradnika stylistycznego, nie masz się czym martwić.
Jednak
typedef
jest błędne, po prostu napisz
struct Region {stuff};

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się