gpt4 book ai didi

c++ - 删除保留字而不在循环的第一遍调用析构函数

转载 作者:行者123 更新时间:2023-11-30 02:06:57 26 4
gpt4 key购买 nike

我创建了一个简单的程序,可以在命令提示符下“绘制”形状。我正在使用多个类实现,但主要问题出在 Command 抽象类中,更具体地说是该类中的析构函数。我正在使用我定义的 DEBUG 模式编译它,每次析构函数删除一个对象时打印一个 '-'

Command 类看起来像这样:

class Command {
public:
Command(){
#ifdef DEBUG
std::cout << '+';
#endif
}
virtual ~Command() {
#ifdef DEBUG
std::cout << '-';
#endif
}
virtual void execute() = 0;
virtual void unexecute() = 0;
};

我在另一个类中调用的循环如下:

vector<Command*>  history_;

while(position_ != 0) {
delete *history_.end();
history_.pop_back();
position_--;
}

如果 position_ 大于 1,它会打印 '-' n - 1 次,但不会在第一次删除循环时调用析构函数。

最佳答案

嗯, vector 的最后一个元素不是*history_.end(),而是history_.back()

现在,如果 position 确实表示一个位置,您应该让它达到 0。但是,如果它是项目数量的计数,您应该将其重命名为 count大小

由于 vector 已经包含了在它为空时进行测试的方法,您甚至可以放弃自定义计数器而不必担心它是否应该达到 0:

while(!history.empty()) {
delete history_.back();
history_.pop_back();
}

但由于您实际上是在清除整个 vector ,因此没有必要一次弹出一个元素。您可以遍历 vector ,删除它们,然后立即clear() vector 。

for(size_t i = 0; i < history_.size(); ++i) {
delete history[i];
}
history_.clear();

或者在 C++11 中:

for(auto ptr : history_) {
delete ptr;
}
history_.clear();

关于c++ - 删除保留字而不在循环的第一遍调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com