2013-04-05 6 views
1

Я хочу расширить свой массив на один при вызове функции addBranch, а затем добавить новый объект Branch в эту расширенную пустую область, и я пытаюсь предотвратить код из утечки памяти. Я думал, что делаю правильно, но я застрял в этой функции.ошибка при расширении массива: оператор не найден, который принимает

это дает мне ошибку "binary '=': оператор не найден, который принимает правый операнд типа 'Branch *' (или нет приемлемого преобразования)". Мне нужна помощь, назначая последний элемент новому объекту Branch, который не будет удален после уничтожения функции. Я просто знаком с C++, поэтому могут быть некоторые большие ошибки. Мне не разрешено использовать векторы и т. Д.

// ------- Adds a branch to system -------- // 
    void BankingSystem::addBranch(const int id, const string name){ 
     if(isBranchExisting(id)){ 
      cout << "\n\tBranch " << id << " already exists. Please try it with another id number."; 
     } 
     else if(!isBranchExisting(id)){ 
      Branch* tempArray = new Branch[cntAccounts]; 
      for(int i = 0; i<cntAccounts; i++){ 
       tempArray[i] = allBranches[i]; 
      } 

      delete[] allBranches; 

      allBranches = new Branch[cntAccounts+1]; 
      for(int i = 0; i<cntAccounts; i++){ 
       allBranches[i] = tempArray[i]; 
      } 
      allBranches[cntAccounts] = new Branch(id, name); // error at this line 

     } 
    } 
+1

Just наводке кодирования: если вы создаете '' tempArray' с новой ветви [cntAccounts + 1] ', то вы может скопировать все элементы из 'allBranches' в' tempArray', затем добавить новый элемент в конец 'tempArray', затем' delete [] allBranches', затем 'allBranches = tempArray'. Это требует копирования элементов только один раз, а не дважды. Лучше, однако, как говорили другие, использовать 'std :: vector ', что делает все это для вас. –

+0

Мне нужно удалить 'tempArray' после выполнения' allBranches = tempArray'? –

+0

Нет, не удаляйте его. Он указывает на ваши текущие данные, как и 'allBranches'. Если вы удалите его ** оба указателя ** указывают на мусор. –

ответ

3

Как говорится в сообщении об ошибке, вы пытаетесь назначить указатель на объект. Вы (вероятно) нужно назначить объект вместо:

allBranches[cntAccounts] = Branch(id, name); // no "new" 

Я также предлагаю вам использовать std::vector<Branch>, а не вручную кованых решеток. Это исправит утечку памяти из забывания, чтобы удалить tempArray, или от чего-то выбросившего исключение, если вы добавите недостающий delete[].

Кроме того, если вы используете vector, то весь танец может быть заменен

allBranches.push_back(Branch(id, name)); 
+0

Тогда вот мой вопрос: удаляется ли этот объект после выполнения функции? Я смотрел много видеоматериалов об управлении памятью, но я все еще некомпетентен. Кроме того, я хотел бы использовать их, но, как я заявил в своем вопросе, нам это не разрешено. –

+1

@ BurakÖzmen: Концептуально создает временный объект, перемещает или копирует его в массив, а затем уничтожает временный объект; копия в массиве остается такой же, как и массив. (На практике копирование или перемещение будет устранено оптимизацией «копирование»). –

+0

@ BurakÖzmen: Лучший подход к управлению памятью - не управлять этим самостоятельно. Используйте контейнеры и интеллектуальные указатели, чтобы сделать это за вас. Если вы действительно хотите сделать это самостоятельно, тогда это просто: все, что вы создаете с помощью 'new' /' new', должно быть уничтожено с помощью 'delete' /' delete [] '. Все созданное без 'new' будет автоматически уничтожено. –