Я прихожу из 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);
}
}
}
Если 'currentCell' был * не * a' Cell * ', а вместо' Cell', он будет инициализироваться по умолчанию до того, как ваш код конструктора будет выполнен. Существует также синтаксис для использования параметров конструктора. – crashmstr
Вы должны быть осторожны, потому что вы используете конструктор копирования по умолчанию и оператор присваивания по умолчанию для вашего класса «Событие». Я рекомендую их реализовать явно. –
Некоторые советы. Поскольку вы используете Java, вам следует попытаться не использовать Java для написания кода на C++, так как это приведет вас к неправильному пути решения проблемы. У вашего кода есть утечки памяти здесь: 'newEvent1 = новое событие (* childCell, time, newDir); events.push (* newEvent1); 'Это может выглядеть нормально на Java, но катастрофически на C++. – PaulMcKenzie