Вопрос дизайна: Как я могу поддерживать стек объектов - PullRequest
0 голосов
/ 23 февраля 2010

У меня есть структурный вызов 'A', который имеет атрибут 'i', например:

typedef struct a {
   a() { i = 0;}
   int i;
} A;

И я хотел бы сохранить стек А в своем основном классе:

class Main {
   public:  
      void save();
      void doSomethingToModifyCurrentA();
      void restore();

   private:
     A currentA;
     stack<A> aStack;
  }

Я хотел бы написать функцию save (), которая сохраняет текущие значения A (например, i) в стек, и я могу перейти к doSomethingToModifyCurrentA (), чтобы изменить currentA. А потом я могу восстановить A, вызвав restore ().

Мой вопрос

  • Как я могу выделить память для копии A в «стеке»?
  • Как вытащить копию A, освободить память и восстановить значение 'currentA'?

Ответы [ 4 ]

3 голосов
/ 23 февраля 2010

В библиотеке C ++ STL есть реализация stack, которую вы можете использовать, и есть методы push и pop.

push используется для добавления элемента в стек, а pop - для удаления одного из стека.

Посмотрите этот учебник.

1 голос
/ 23 февраля 2010

Вам не нужно ничего делать, чтобы зарезервировать память в стеке.Базовый контейнер (по умолчанию deque) управляет памятью.

Три важных метода: ...

mystack.push (myvalue);
mystack.top ();
mystack.pop ();

Pop не читает верхнее значение - просто отбрасывает его.Метод top возвращает ссылку на текущее верхнее значение, поэтому вы можете написать ...

??? = mystack.top ();
mystack.top () = ???;

Чтобы прочитать или перезаписать верхнее значение.

Эти методы преобразуются в следующие вызовы влежащая в основе deque ...

mydeque.push_back (myvalue);
mydeque.back ();
mydeque.pop_back ();

Лично я обычно просто использую deque непосредственно - хотя строго, стек лучше для удобочитаемости и ремонтопригодности, поскольку он лучше выражает намерение и препятствует тому, чтобы некоторые вещи были несовместимыс этим намерением.

0 голосов
/ 23 февраля 2010

Предполагая, что A является относительно простым (даже если не просто целое число в качестве примера), вы можете решить оба вопроса, просто используя стек значений и позволяя ему копировать и распределять память.

Работа с вашим примером кода:

void Main::save()
{
    aStack.push(currentA);
}

void Main::restore()
{
    currentA = aStack.top();
    aStack.pop();
}
0 голосов
/ 23 февраля 2010

Вы можете рассмотреть возможность использования A & для текущего A. (и загляните в стек STL для реализации

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