您能帮我用C++编写合成示例应用程序吗?
我需要这样的层次结构:AppleCake类继承自Cake的基类,并且有CakePacket类,其中有4个Cakes。我写了部分代码,但是问题是我不知道如何向CakePacket添加4个Cake对象。我是C++的初学者,所以很抱歉如果出现一些愚蠢的错误。
#include <iostream>
using namespace std;
class Cake {
protected:
int cost;
public:
void setCostr(int a) { cost = a; }
int getCost() { return cost; }
Cake(int x) { cost = x; }
~Cake() { }
};
class AppleCake : public Cake {
int diameter;
public:
int getDiameter() { return diameter; }
AppleCake(int x, int y): Cake(x)
{ diameter = y; }
~AppleCake() { }
};
class CakePacket
{
private:
Cake *cArr;
CakePacket() { }
public:
CakePacket(Cake *x) //there have to be 4 Cake objects in CakePacket
: cArr(new Cake[4]) {};
};
最后一个问题是-如何创建CakePacket的对象?
稍后,我将不得不再创建一个组合,某个类将包含1个CakePacket。但我希望将1 CakePacket对象添加到其他类不会有问题。
感谢您的所有答案!
最佳答案
自从上一个小时以来,没有人把它弄对...实际上@ taylorc93是最接近的,但他仍然犯了一个错误。
因此,回到问题所在。 CakePacket应该存储蛋糕,对吗? Cake
是基类,但是没有虚拟方法。在这种情况下,完全不需要使用指针,而唯一要做的就是使用一些容器。现在,您选择哪种选择取决于CakePacket的所需用法。让我们以一般的方式编写它,然后:
class CakePacket {
// this can be whatever you might need; a list, set, unordered_set...
// vector is a reasonable default
vector<Cake> cakes;
public:
// We'll also need a way to add them:
void addCake(Cake cake) {
// I'm moving the parameter to avoid copying
// refer to "move semantics" to understand it deeper
cakes.push_back(std::move(cake));
}
};
瞧!您已经问过如何创建CakePacket,这很简单。CakePacket cp;
cp.addCake(Cake(1));
cp.addCake(Cake(2));
cp.addCake(Cake(3));
当然,您可以将它们移到CakePacket
的构造函数中,但是...CakePacket cp { Cake(1), Cake(2), Cake(3), Cake(4) };
如果您希望能够从类似数组的列表中进行创建,则需要提供采用initializer_list<Cake>
的附加构造函数,但我将其保留为练习。 (提示:您不需要,需要for
循环)。CakePacket真的有必要吗?
这是一个有学习意义的问题,所以我不会对此挑剔,但我想指出一个事实,CakePacket的确是如何工作的……至少在当前状态下什么都不做。有时,简单地使用
std
容器而不是将其包装为全新类型会更容易。这避免了用多余的类污染代码,并且您会惊讶标准库为您提供了使用其容器的功能。警告
如果您尝试将AppleCake存储在其中,则
diameter
将被 slice ,即仅保存公共(public)部分。在这种情况下,您需要存储指向基类的指针(使用boost::ptr_vector<Cake>
或std::vector<std::unique_ptr<Cake>>
),或使用类似Boost.Variant
的指针。您当然不想在这里做什么
...正在存储原始指针。您将必须销毁添加到CakePacket dtor中的每个Cake,这很容易出错,根本没有必要。
使用C样式数组也很糟糕,因为它会限制您的大小固定。