2015-05-27 3 views
0

Я пытаюсь сохранить некоторые объекты в массиве. Вот пример кода для введения моей проблемы.Array, * ptr или ** ptr C++

Было бы здорово, если бы вы могли дать мне решение и каковы могут быть последствия?

class Worker 
    { 
    //Vars 
    private int m_id; 
    private int m_money; 
    //And so on.... 

    } 

class Factory 
    { 
    //Should I use a double pointer 
    private Worker **m_workerarray; 

    //A normal pointer 
    private Worker *m_workerarray; 

    //Or a worker array 
    private Worker[] m_workerarray; 

    //I think it´s better for every solution to 
    //store the Array lenght 
    private int m_arraylenght; 
    } 
+1

http://www.cplusplus.com/reference/stl/ –

+1

Если вы все еще используете массивы C-стиля и необработанные указатели, зачем вообще использовать C++? '' и '' являются двумя самыми непосредственными преимуществами C++. Я также рекомендую вам заблаговременно забрать [shared_ptr] (http://en.cppreference.com/w/cpp/memory/shared_ptr). – DevSolar

+0

Пожалуйста, посмотрите страницу [this] (http://stackoverflow.com/help/how-to-ask). Вопрос по существу действителен, но требует немного внимания. – laurisvr

ответ

4

Вам следует избегать необработанных указателей и C-подобных массивов. Вы можете использовать std::vector или std::array

2

Как Eliried упоминается std::vector, вероятно, один из самых распространенных способов, что это будет сделано. Кроме того, необходимо было бы #include <vector>

Результирующее в чем-то вроде этого: std::vector<Worker> factory;

Для получения дополнительной информации о векторах и контейнеров вы можете посмотреть здесь: http://www.cplusplus.com/reference/stl/

Это может быть сделано с сырыми указателями, но векторов было бы более простой способ сделать это

1

Я перечислил ваши варианты и свои собственные в общем порядке удобства использования. Обратите внимание, что все варианты имеют свои возможности. Некоторые из них более редки.

используя STL контейнер

Это почти во всех случаях будет самое умное, что делать. Примеры контейнеров STL: std::vector и std::list. Если вы похожи на меня, вы можете почувствовать, что использование массивов стиля C даст вам лучшую производительность. Это не обязательно так. Для массивов динамических размеров и в некоторых случаях даже массивы с фиксированным размером. Контейнеры STL имеют равную или лучшую производительность для массивов стилей C.

Если вы хотите узнать, какой STL-контейнер использовать. Возможно, вам стоит взглянуть на this page.

частный работник [] m_workerarray;

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

частный работник * m_workerarray;

Обычный указатель в общем случае должен использоваться только для объектов, которые могут быть пустыми и создаются динамически. И даже тогда есть более безопасные способы сделать это. Я бы решительно отказался использовать их в качестве массивов. Если вам не нужна очень высокая производительность, динамический массив, сделанный по этому случаю. В стандартном контейнере STD в целом имеет равную или лучшую производительность для большинства применений.

частный работник ** m_workerarray;

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

Примечание:

// Я думаю подмигнуло лучше для каждого решения // хранить массив длину частного работника * m_workerarray;

Это не просто лучше, это необходимо для каждого решения, которое вы передали. Единственным исключением является массив фиксированного размера ([]).

1

Это зависит от ситуации. Если ваш класс будет удерживать фиксированное число или известное максимальное число из Worker объектов, то подходит Worker[]. Если вам нужно беспокоиться об изменении размера массива, ситуация более сложная. Здесь std::vector приходит в свои руки.

Смежные вопросы