Вектор в структуре - лучший подход? C ++ - PullRequest
9 голосов
/ 06 июня 2011

Я пытаюсь включить вектор в мою структуру.

Вот моя структура:

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;

Является ли вектор в этом объявлении допустимым или имеет смысл сделать указатель на вектор. В случае указателя на вектор, мне нужно выделить новый вектор. Как мне это сделать?

Спасибо!

Редактировать: Проблема в том, что в результате возникает ошибка, которая указывает на xmemory.h, файл, включенный в платформу 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
         }

Интересно, что этого не произойдет, если я выделю его вне структуры и просто в функции, которую использую. Есть идеи?

Ответы [ 4 ]

5 голосов
/ 06 июня 2011

Вы можете написать это без typedef:

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

Чтобы ответить на ваши вопросы:

Является ли вектор в этой декларации действительным

Да, это так.

или имеет смысл сделать указатель на вектор.

Нет, вероятно, нет. Если бы вы это сделали, вам пришлось бы реализовать конструктор копирования, оператор присваивания и деструктор для поведения копирования. В конечном итоге вы получите то же самое, но это будет дополнительная работа и потенциальные ошибки.

В случае указателя на вектор, нужно ли выделить новый вектор. Как мне это сделать?

Вам потребуется реализовать конструктор копирования , оператор присваивания и деструктор :

// 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;
}

Итог: ваш код в порядке. Вам не нужно менять его.

РЕДАКТИРОВАТЬ: Исправить оператор присваивания: проверить сравнение с этим и вернуть * это.

3 голосов
/ 06 июня 2011

Имеет смысл сделать это, и вам не нужно new ни в каком отношении, если только вы не хотите использовать псевдоним для отдельного вектора. Кроме того, вам не нужны никакие вещи typedef, происходящие здесь.

2 голосов
/ 06 июня 2011

Зависит от того, как вы его используете.

Если вы хотите скопировать вектор и данные при копировании структуры Region, оставьте ее без указателя.

Еслиесли вы не хотите, чтобы он был скопирован, тогда вам понадобится какой-то указатель на вектор.

Если вы используете указатель на вектор, вы должны быть очень осторожны с безопасностью исключения выделения / освобождения.Если вы не можете ограничить выделение безопасным способом, то у вас останется возможность утечек памяти.

Возможны следующие варианты:

  • Убедитесь, что кодкоторый выделяет вектор (и использует Region), также освобождает вектор и сам по себе безопасен для исключений.Это потребует, чтобы Region существовал только внутри области действия этого кода.
    Вы можете сделать это, просто выделив вектор в стеке и передав его указателю в Region.Затем убедитесь, что вы никогда не вернете объект Region выше этого стекового фрейма.
  • Вы также можете использовать своего рода умный указатель -> vector в вашем Region.
1 голос
/ 06 июня 2011

Вектор в порядке.Имейте в виду, что если вы скопируете эту структуру, вектор будет скопирован с ней.Поэтому в коде с определенными ограничениями производительности обращайтесь с этой структурой так же, как с любым другим дорогим для копирования типом.

В рабочем коде некоторые люди предпочитают использовать ключевое слово classа не ключевое слово struct для определения этого класса, поскольку член vector делает его не POD.Если вы автор своего собственного руководства по стилю, вам не о чем беспокоиться.

Но typedef не так, просто напишите struct Region { stuff };

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...