C ++ Помощь с указателями для студента - PullRequest
0 голосов
/ 26 февраля 2011

Я пытаюсь создать вектор и передать его функции, позволяющей изменять вектор.Вот сокращенная версия моего кода, который не работает.

void addStudent(vector<Student*>*);
int main()
{
   vector<Student*> students = new vector<Student*>;
   addStudent(students);
   return(0);
}
void addStudent(vector<Student*> *students)
{
   students->push_back(new Student("bob")); 
}

Этот код компилируется с ошибками.Я думаю, что неправильно передаю указатель, но я не уверен.

Ответы [ 3 ]

3 голосов
/ 26 февраля 2011

Вы обещали дать addStudent указатель на вектор:

void addStudent(vector<Student*> *students)

Итак, используйте оператор address-of для получения указателя:

vector<Student*> students;
addStudent(&students);

Здесь нет ничего, что действительно нуждается в динамическом размещении, но если вы это сделали, обратите внимание, что new также возвращает указатель:

vector<Student*>* students_ptr = new vector<Student*>();
addStudent(students_ptr);

Другой вариант - передать по ссылке:

void addStudent(vector<Student*>& students)
vector<Student*> students;
addStudent(students);

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

2 голосов
/ 26 февраля 2011

Ваша проблема здесь:

vector<Student*> students = new vector<Student*>;

students объявлен как тип значения, но вы назначаете ему указатель.

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

1 голос
/ 26 февраля 2011

Вы, вероятно, из Java фона ... поэтому вам придется научиться жить без new некоторое время:)

В C ++ есть 2 способа создания объектов:

  • объекты с автоматической продолжительностью хранения (созданные в стеке)
  • объекты с динамическим сроком хранения (созданные в куче)

new создает объекты второго рода, для которых ВЫ должны обеспечить надлежащую утилизацию (вызывая delete в соответствии с учебниками, но ... пока мы будем избегать этого).

Здесь вам не нужно new:

std::vector<Student> students; // create an empty `vector` of `Student` objects

students.push_back(Student("bob")); // push a new Student in the vector

Что касается функции, у вас есть несколько возможностей:

  • заставить его вернуть объект
  • передать объект по ссылке void addStudent(std::vector<Student>& students);
  • передать по указателю, но затем использовать адрес оператора , чтобы добраться до него addStudent(&students);

Вам не обязательно использовать указатели повсюду в C ++ ... на самом деле, для начала, вероятно, лучше не использовать.

О, и вам определенно нужен хороший учебник, это базовый материал, и вы не сможете войти в C ++ без скучных основ ... извините: /

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