В C++, если я хочу массив указателей так, чтобы я мог сделать, чтобы они указали на различные объекты на последнем этапе, что делает синтаксис, похожи.
Править
Я должен разъяснить то, что я пытаюсь сделать, я предполагаю. У меня есть нечто класса, которое имеет, и добавьте метод. В добавить методе я беру ссылку на панель класса. Я хочу сохранить ту ссылку в массив указателей панели. Массив панели указателя должен будет быть расширен все время это, у меня нет проблем с. Это создает и массив на "куче" указателей так, чтобы я мог присвоить объекты панели им позже. То, что я попробовал, кажется, перестало работать, поскольку панель класса не имеет конструктора по умолчанию, на которого жалуется компилятор. Это приводит меня думать, что я создавал и массив фактических объектов, которые я не хотел делать.
Никакой stl и не я не хочу слышать о том, как Вы думаете, что это является сумасшедшим и т.д., который является Вашим мнением.
Я бы сделал что-то вроде этого:
class Foo{
...
};
int main(){
Foo* arrayOfFoo[100]; //[1]
arrayOfFoo[0] = new Foo; //[2]
}
[1] Это создает массив из 100 указателей на Foo-объекты. Но на самом деле никаких Foo-объектов не создается.
[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;
}
Что вы хотите, так это:
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]
. Разве это не выглядит наоборот? Поскольку объявление массива в языке Си - это шаблон, указывающий, как добраться до базового типа (а не композиция выражений массива, как можно было бы ожидать), объявления массивов и код, использующий массивы, не обязательно должны быть перевернутыми.
Если вы не используете 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 []
.