我正在尝试为披萨餐厅创建一个课程,其中我有if ($options == 'on') {$attr .= "n xmlns:fb=\"http://ogp.me/ns/fb#\"";}
的单独课程和餐厅的另一个课程。餐厅类有一个动态的Pizza
类型,每次在餐厅添加另一个比萨饼时,其大小会增加。
每当我执行程序时,它会在创建新对象之前停止在for循环中工作,并且调用Pizza
函数而不会给出错误或绝对任何错误。我仍然是编程的新手,所以我想我可能会错误地分配内存,从而导致它冻结。谁能帮我解决一下我做错了什么?
谢谢。
addPizza()
答案 0 :(得分:1)
不确定这是你的问题但是(很大!)问题。
你的class Pizza
在构造函数中使用dinamically分配内存
this->ingredients= new char [strlen(ingredients)+1];
但没有(a)复制构造函数,(b)移动构造函数,(c)operator=(Pizza const &)
和(d)operator=(Pizza &&)
。
这可以保证你的问题;大问题。
可以给你带来问题的一点是class Pizzeria
(en passant:另一个具有动态内存分配的类,一个体面的复制构造函数但没有(a)移动构造函数,(b)operator=(Pizzeria const &)
和( d)operator=(Pizzeria &&)
)其中,在复制构造函数中,你有
this->p[i] = x.p[i];
在此指令(调用隐式operator=(Pizza const &)
)之后,this->p[i]
和x.p[i]
具有ingredients
的相同值。
第一个被称为析构函数时没问题。但是当被称为第二个的析构函数时,你在相同的分配值上有一个双重释放,这个值是未定义的行为,但通常会使程序崩溃。
一些建议。
您标记了C ++ 11,因此您可以使用智能指针(std::unique_ptr
,std::shared_ptr
)。
尽可能避免直接管理动态分配的内存并使用std::string
和STL容器(例如:std::string
ingredients
和{{{} 1}} std::vector<Pizza>
中的Pizza
。
如果无法避免管理动态分配的内存,请使用智能指针。
当您被迫(但真的被迫)直接使用class Pizzeria
和new
时,请记住复制并移动指导者delete
&#39; >
答案 1 :(得分:0)
我不知道你想要对你的第二堂课做什么,但是你可以按照以下方式重写你的第一堂课,然后一半的头痛就消失了。
#include <iostream>
#include <string>
using namespace std;
class Pizza
{
private:
string name;
int price;
int reduction;
string ingredients;
public:
Pizza (const string& name, const int& price, const int& reduction,
const string& ingredients)
:name(name), price(price), reduction(reduction), ingredients(ingredients)
{}
~Pizza () {}
bool areSame(const Pizza& p)const
{ return this->ingredients == p.ingredients; }
const int& getReduction()const { return reduction;}
void print()
{
cout << "name: " << name<< " ingredients: " << ingredients<< " Price: " << price;
}
};
如果你能解释你的第二课的想法,我可以帮忙。
第二个类应该开始如下所示(注意我有char*
更改为std::string
这更容易思考:
class Pizzeria
{
private:
string name;
int number_of_pizzas;
Pizza *p;
public:
Pizzeria() = default;
Pizzeria(const string& name)
:name(name), number_of_pizzas(0), p(nullptr) {}
Pizzeria(const string& name, const int& number, Pizza *p)
:name(name), number_of_pizzas(number), p(p) {}
// hope, you wanted a copy constructor here.
Pizzeria(const Pizzeria &x)
:name(x.name), number_of_pizzas(x.number_of_pizzas)
{
this->p = new Pizza(*x.p);
}
~Pizzeria() { delete[] p; }
void addPizza(Pizza P)
{
//explain the concept
}
void pizzasOnPromotion()
{
//explain the concept
}
void setName(const string& name) { this->name = name; }
const string& getName()const { return name; }
};