您能帮我用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样式数组也很糟糕,因为它会限制您的大小固定。

07-24 19:24