Массив классов.Стек или куча? - PullRequest
3 голосов
/ 19 февраля 2010
class temp;

temp *t;

void foo() { temp foo2; t[1] = foo2; }

int main() { 
    t = new temp[100];
    foo();
    //t[1] is still in memory?
}
  • Если мне нужен массив таких классов, я собираюсь использовать указатель на указатель? (и использовать 'new' для каждого элемента в массиве) EG: temp **t;
  • если я хочу сделать массив из 100 ptr в ptr, у меня есть todo temp **t = new temp[100][1]; Есть ли лучший способ сделать это без 4 квадратных скобок?

Ответы [ 3 ]

12 голосов
/ 19 февраля 2010

код:

t = new temp[100];

создает массив из 100 объектов типа temp. Более безопасный способ сделать то же самое:

std::vector <temp> t(100);

, которая освобождает вас от необходимости вызывать delete [] для массива.

4 голосов
/ 19 февраля 2010

Старайтесь вообще избегать новых вещей, пока точно не поймете, что делаете.

std::vector<temp> t(100);

отлично выполнит работу.Вы по-прежнему можете обращаться к нему с помощью оператора [] и, как в своем решении.

temp foo2; t[1] = foo2;

вызовет оператор присваивания временного класса.используйте & для передачи переменной в функцию.

void foo1(std::vector<temp>& lt)
{
}

void foo2(temp& lt)
{
}

foo1(t);
foo2(t[1]);
1 голос
/ 19 февраля 2010

Во-первых, я поддерживаю предложения других, чтобы избежать новых и использовать вместо них std :: vector. std :: vector избавляет от многих головных болей, вызванных указателями и массивами. Массивы - это решение C, а не C ++.

Чтобы ответить на ваш вопрос: вам не нужен тип указатель-указатель здесь. Причина в том, что массивы естественным образом адресуются указателем.

Когда вы говорите t = new temp[100];, происходят две вещи:

  • Новый массив выделяется из свободного хранилища (или «кучи»)
  • t указывает на первый элемент нового массива.

Когда вы используете оператор p[i], на самом деле это синтаксический сахар для *(p + i). Например:

  • t[0] эквивалентен *(t + 0), который является просто *t, или элементу, на который указывает t: первый элемент массива.
  • t[1] эквивалентно *(t + 1). Поскольку t - это указатель на первый элемент массива, t + 1 - это указатель на элемент, расположенный на одну позицию после первого: второй элемент. Так что *(t + 1) дает вам второй элемент.

Используя эту систему, указатель temp * может использоваться для ссылки на весь массив temp вместо одного temp экземпляра.

Если вы действительно хотите узнать о массивах и указателях, вы можете поступить хуже, чем читать главу 6 comp.lang.c FAQ . Обратите внимание, однако, что это ресурс C, а не ресурс C ++; это связано с тем, что в C ++ массивы обычно не используются, потому что у вас есть лучшая функция: std :: vector. Я настоятельно рекомендую вам сделать изучение std :: vector более приоритетным, чем изучение указателей и массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...