Массив C++ указателей

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

Править

Я должен разъяснить то, что я пытаюсь сделать, я предполагаю. У меня есть нечто класса, которое имеет, и добавьте метод. В добавить методе я беру ссылку на панель класса. Я хочу сохранить ту ссылку в массив указателей панели. Массив панели указателя должен будет быть расширен все время это, у меня нет проблем с. Это создает и массив на "куче" указателей так, чтобы я мог присвоить объекты панели им позже. То, что я попробовал, кажется, перестало работать, поскольку панель класса не имеет конструктора по умолчанию, на которого жалуется компилятор. Это приводит меня думать, что я создавал и массив фактических объектов, которые я не хотел делать.

Никакой stl и не я не хочу слышать о том, как Вы думаете, что это является сумасшедшим и т.д., который является Вашим мнением.

22
задан Evan Carslake 15 August 2015 в 16:11
поделиться

5 ответов

2
ответ дан 29 November 2019 в 03:37
поделиться

Я бы сделал что-то вроде этого:

class Foo{
...
};

int main(){
  Foo* arrayOfFoo[100]; //[1]

  arrayOfFoo[0] = new Foo; //[2]
}

[1] Это создает массив из 100 указателей на Foo-объекты. Но на самом деле никаких Foo-объектов не создается.

[2] Это один из возможных способов создать экземпляр объекта и в то же время сохранить указатель на этот объект в первой позиции вашего массива.

3
ответ дан 29 November 2019 в 03:37
поделиться

Например, если вам нужен массив указателей int , это будет int * a [10] . Это означает, что переменная a представляет собой набор из 10 int * s.

РЕДАКТИРОВАТЬ

Думаю, это то, что вы хотите сделать:

class Bar
{
};

class Foo
{
public:

    //Takes number of bar elements in the pointer array
    Foo(int size_in);

    ~Foo();
    void add(Bar& bar);
private:

    //Pointer to bar array
    Bar** m_pBarArr;

    //Current fee bar index
    int m_index;
};

Foo::Foo(int size_in) : m_index(0)
{
    //Allocate memory for the array of bar pointers
    m_pBarArr = new Bar*[size_in];
}

Foo::~Foo()
{
    //Notice delete[] and not delete
    delete[] m_pBarArr;
    m_pBarArr = NULL;
}

void Foo::add(Bar &bar)
{
    //Store the pointer into the array. 
    //This is dangerous, you are assuming that bar object
    //is valid even when you try to use it
    m_pBarArr[m_index++] = &bar;
}
7
ответ дан 29 November 2019 в 03:37
поделиться

Что вы хотите, так это:

Foo *array[10]; // array of 10 Foo pointers

Не путать с:

Foo (*array)[10]; // pointer to array of 10 Foos

В любом случае, ничего не будет автоматически инициализировано, потому что они представляют собой указатели на Foos, которые еще не были присвоены чему-либо (например, с помощью new).

Я окончательно "понял" синтаксис объявления указателей/массивов в C, когда понял, что он описывает, как вы получаете доступ к базовому типу. Foo *array[5][10]; означает, что *array[0..4][0..9] (подзапись на массив из 5 элементов, затем подзапись на массив из 10 элементов, затем разыменование как указатель) получит доступ к объекту Foo (обратите внимание, что [] имеет более высокий приоритет, чем *).

Это кажется обратным. Можно подумать, что int array[5][10]; (он же int (array[5])[10];) - это массив из 10 int array[5]. Предположим, что это так. Тогда вы получили бы доступ к последнему элементу массива, сказав array[9][4]. Разве это не выглядит наоборот? Поскольку объявление массива в языке Си - это шаблон, указывающий, как добраться до базового типа (а не композиция выражений массива, как можно было бы ожидать), объявления массивов и код, использующий массивы, не обязательно должны быть перевернутыми.

54
ответ дан 29 November 2019 в 03:37
поделиться

Если вы не используете STL, тогда код будет выглядеть lot бит, как C.

#include <cstdlib>
#include <new>

template< class T >
void append_to_array( T *&arr, size_t &n, T const &obj ) {
    T *tmp = static_cast<T*>( std::realloc( arr, sizeof(T) * (n+1) ) );
    if ( tmp == NULL ) throw std::bad_alloc( __FUNCTION__ );
       // assign things now that there is no exception
    arr = tmp;
    new( &arr[ n ] ) T( obj ); // placement new
    ++ n;
}

T может быть любым типом POD, включая указатели. .

Обратите внимание, что arr должен быть выделен malloc , а не new [] .

3
ответ дан 29 November 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: