2014-11-25 3 views
0

Я прихожу из Java и нахожу некоторые объекты очень запутанными.Переназначить объект в стеке в C++

В моем коде у меня есть класс Event, который имеет атрибут Cell. Когда я создаю новое событие, я хочу инициализировать ячейку без использования «нового» ключевого слова. Код ниже. В конструкторе Event все, что я могу сделать, это поставить «currentCell = new Cell()». Есть ли способ инициализировать currentCell, не делая этого?

В целом, если у меня есть объект, например currentEvent, как я могу обновить его, чтобы иметь различную информацию? Скажет currentEvent имеет ячейки а и время пункта 10, и теперь я хочу, чтобы хранить ячейки Ь и временную точку 12. В Java я хотел бы сделать:

Event e1 = new Event(a, 10); 
e1 = new Event(b, 12); 

Но я хочу, чтобы это сделать эквивалентную вещь в C++, не подвергая все в стеке.

Вот файл заголовка события:

class Event { 
public: 
    Event(); 
    int getTime() { return timePoint; } 
    void setTime(int newTime); 
    void setCell(Cell & newCell); 
    virtual ~Event(); 
private: 
    Cell * currentCell; //Class is made up of a pointer to a cell and a time 
    int timePoint; 
}; 

И конструктор в Event.cpp:

Event::Event() 
{ 
    //Cell currentCell; 
    currentCell = new Cell(); //don't want to use new, but do what to initialize currentCell to a blank new cell 
    timePoint = rand() % 6 + 5; 
} 

И общий вопрос:

priority_queue<Event, vector<Event>, CompareEvent> events; 
Event firstEvent(*start, time); 
events.push(firstEvent); 
Event * newEvent1; //I want to reassign newEvent1 and newEvent2 each time through the loop but would rather not have to use the heap 
Event * newEvent2; 

//temp int counter 
int counter = 0; 

while ((!(events.empty())) && (counter<5000)){ 

    //Get next event 
    currentEvent = events.top(); 
    currentCell = currentEvent.getCell(); 
    if (currentCell->isAlive()) { 

     bool canGrow = false; 
     if (currentCell->selfGrows() || currentCell->withinRange()){ 
      canGrow = true; 
     } 

     if (canGrow){ 

      //Perform mitosis 

      //Create a daughter cell and add it to the list; increment counter 
      daughterCell = new Cell(*currentCell); 

      newEvent1 = new Event(*daughterCell, time, newDir); 
      events.push(*newEvent1); 

      } 

     } 
    } 
+2

Если 'currentCell' был * не * a' Cell * ', а вместо' Cell', он будет инициализироваться по умолчанию до того, как ваш код конструктора будет выполнен. Существует также синтаксис для использования параметров конструктора. – crashmstr

+0

Вы должны быть осторожны, потому что вы используете конструктор копирования по умолчанию и оператор присваивания по умолчанию для вашего класса «Событие». Я рекомендую их реализовать явно. –

+0

Некоторые советы. Поскольку вы используете Java, вам следует попытаться не использовать Java для написания кода на C++, так как это приведет вас к неправильному пути решения проблемы. У вашего кода есть утечки памяти здесь: 'newEvent1 = новое событие (* childCell, time, newDir); events.push (* newEvent1); 'Это может выглядеть нормально на Java, но катастрофически на C++. – PaulMcKenzie

ответ

1

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

class Event { 
public: 
    Event(); 
    int getTime() { return timePoint; } 
    void setTime(int newTime); 
    void setCell(Cell & newCell); 
    virtual ~Event(); 
private: 
    Cell currentCell; // <-- no need to have this as a pointer (asterisk removed) 
    int timePoint; 
}; 
1

Я хочу инициализируйте ячейку, не используя «новое» ключевое слово.

Инициализация выполняется конструктором. new используется для динамического распределения (в куче). Эти два понятия ортогональны. Так что, очевидно, вы можете это сделать.

newEvent1 = new Event(*daughterCell, time, newDir); 

Если вы не хотите создавать его в куче, создать объект в стеке:

Event newEvent1(*daughterCell, time, newDir); 

Не забудьте создать соответствующий construtor, который ожидает, что эти параметры. И проверьте правило три.

+0

Не забудьте закрыть копирование/назначение (это часть вопроса). –

+1

Хм .. Я вижу запрос на это, но я не вижу необходимости в этом коде ... –

+1

Я, вероятно, больше не буду писать, * серьезно *, выбрать книгу или статью и изучить основы. Использование семантики Java для программирования на C++ приведет к катастрофе ... –

Смежные вопросы