gpt4 book ai didi

C++ 能否帮我编写 Composition 示例应用程序?

转载 作者:行者123 更新时间:2023-11-30 01:58:23 25 4
gpt4 key购买 nike

你能帮我用 C++ 编写组合示例应用程序吗?

我需要这样的层次结构:类 AppleCake 继承自基类 Cake,还有类 CakePacket,它有 4 个蛋糕。我写了一部分代码,但问题是我不知道如何将 4 个 Cake 对象添加到 CakePacket。我是 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将被切片,即只有公共(public)部分会被保存。在这种情况下,您需要存储指向基类的指针(使用 boost::ptr_vector<Cake>std::vector<std::unique_ptr<Cake>> ),或者使用类似 Boost.Variant 的东西.

你当然不想在这里做的事情

... 正在存储原始指针。您将不得不销毁添加到 CakePacket dtor 中的每个 Cake,这很容易出错并且根本没有必要。

使用 C 风格的数组也很糟糕,因为它用固定大小限制了你。

关于C++ 能否帮我编写 Composition 示例应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17527035/

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