С++ Массив указателей
В С++, если мне нужен массив указателей, чтобы я мог указать на разные объекты на последнем этапе, как выглядит синтаксис.
ИЗМЕНИТЬ
Мне нужно уточнить, что я пытаюсь сделать, я думаю. У меня есть класс foo, который имеет и добавляет метод. В методе добавления я беру ссылку на панель классов. Я хочу сохранить эту ссылку в массив указателей. Массив строки указателя необходимо будет постоянно расширять, с чем у меня нет проблем. Он создает и массирует кучу указателей, поэтому я могу позже назначить им барочные объекты. То, что я пробовал, кажется, терпит неудачу, поскольку класс bar не имеет конструктора по умолчанию, о котором компилятор жалуется. Это заставило меня думать, что я создаю и массиву реальных объектов, которые я не хотел делать.
Пожалуйста, нет stl и нет, я не хочу слышать о том, как вы думаете, что это сумасшедший и т.д., что вы думаете.
Ответы
Ответ 1
Что вы хотите:
Foo *array[10]; // array of 10 Foo pointers
Не путать с:
Foo (*array)[10]; // pointer to array of 10 Foos
В любом случае ничто не будет автоматически инициализировано, поскольку они представляют указатели на Foos, которые еще не назначены на что-либо (например, с новым).
Я наконец получил синтаксис объявления указателя/массива в C, когда понял, что он описывает, как вы обращаетесь к базовому типу. Foo *array[5][10];
означает, что *array[0..4][0..9]
(индекс в массиве из 5 элементов, затем индекс в массиве из 10 элементов, затем разыменование как указатель) будет обращаться к объекту Foo (обратите внимание, что []
имеет более высокий приоритет, чем *
).
Это кажется обратным. Вы могли бы подумать, что int array[5][10];
(a.k.a. int (array[5])[10];
) представляет собой массив из 10 int array[5]
. Предположим, что так было. Затем вы получите доступ к последнему элементу массива, сказав array[9][4]
. Разве это тоже не выглядит наоборот? Поскольку объявление массива C является шаблоном, указывающим, как перейти к базовому типу (а не к составу выражений массива, как можно было бы ожидать), объявления массивов и код с использованием массивов не должны быть отброшены.
Ответ 2
Например, если вам нужен массив указателей 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;
}
Ответ 3
Я бы сделал что-то в этом роде:
class Foo{
...
};
int main(){
Foo* arrayOfFoo[100]; //[1]
arrayOfFoo[0] = new Foo; //[2]
}
[1] Это делает массив из 100 указателей на Foo-объекты. Но Foo-объекты фактически не созданы.
[2] Это один из возможных способов создания экземпляра объекта и в то же время сохранить указатель на этот объект в первой позиции вашего массива.
Ответ 4
Если вы не используете 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[]
.
Ответ 5
подталкивание: ptr_array
http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/doc/ptr_array.html