Подтвердить что ты не робот

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

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

ИЗМЕНИТЬ

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

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

4b9b3361

Ответ 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[].