举个例子,我们给出了示例代码,我们必须找到它的错误并解释为什么会出现错误。我的问题编号为1-5。
我们有一个类Flight
,声明如下:
class Flight {
public:
~Flight(){for(auto & b: places) delete b; }
....
..
private:
vector<unique_ptr<Bill>>places; //bill is a previously declared class
};
我说是因为b
是unique_ptr而我们无法删除它们,默认情况下它们会被删除。所以我的建议是我们可以更改属性并在C,vector<Bill*>places;
中取正常点,或者只删除析构函数。但是,有人建议我们改为编写b.reset();
还有其他概念上的错误,我不确定我是否正确。其余代码如下:
class Sell {
public:
virtual ~ Sell(){}
virtual double price() const = 0;
protected:
double base_price;
};
class Bill : public Sell {
public:
Bill(int id, double price, string name, bool vegetarian) etc{}
virtual ~Bill()
{}
virtual ostream& display(ostream& out) const
out << "no. " << id << " for " << name << endl; return out;
}
double price() const{
if(vegetarian) { return base_price() - 20; }
else { return base_price(); }
}
private: int id; string name; bool vegetarian;
};
ostream& operator << (ostream& out, const Bill& bill){ return bill.display(out); }
class Business : public Bill {
public: Business(int id, double base_price.........)etc
virtual ~Business() { ~Bill(); }
ostream& display(ostream& out ) const {
out << "business ";
Bill::display(out);
if (extra_space){ out << "with supplementary space. " ; }
return out;
}
double price() {
double p(Bill::price());
if(extra_space) { p*= 1.5; }
return p;
}
private: bool extra_space;
};
//then there is class Flight as defined above.
class Flight {
public:
~Flight(){for(auto & b: places) delete b; }
void sold(Bill* b){ places.push_back(unique_ptr<Bill>(b)); }
void display() const {
for(auto const& b: places){cout << "The Bill " << *b << "is " << b->price() << "Dollars. " << endl;
}}
..
private:
vector<unique_ptr<Bill>>places; //bill is a previously declared class
};
int main(){
Flight f1;
f1.sold(new Bill(1,100,"Chopin", true));
f1.sold(new Business(2, 100, "Sand, false, true)):
f1.display() << endl;
return 0;
}
virtual double Bill::price() const
被隐藏了。我建议这是屏蔽,并且账单类中的价格函数应该是虚拟的。这有意义吗?double Business::price() [Woverloaded-virtual]
也发出警告。我不明白,这是因为const
中定义的price()
类中没有business
?price()
被认为是所有类中的相同功能吗?因为我不明白如果商业价格中缺少const
,它会编译。我原以为它不仅会显示警告而且会显示编译错误...... main()
函数,(new Business)
存在问题,这是因为我们只能为帐单创建地址吗?答案 0 :(得分:0)
几乎所有类,如果它们是用c ++ 11或更高版本编写并且设计得当,则不会有用户定义的析构函数,用户定义的复制运算符或用户定义的移动运算符。
有一个很好的理由,即如果你没有定义任何这些,编译器将为你生成正确的版本。
在你的情况下,Bill
的向量是通过std :: unique_ptr管理账单的生命周期(好!!)。这意味着生命周期将被自动正确管理,你的第一个直觉是正确的 - 只需删除析构函数,让编译器做正确的事。
你朋友建议用.reset()替换删除也是正确的,但是很复杂且不必要。