- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你能帮我用 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 的真正作用……什么都没有,至少在目前的状态下是这样。有时简单地使用 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/
嗨,我是第一次玩 Pig,我很好奇如何处理将一个字段拆分成多个其他字段。 我有一个包,A,如下图: grunt> Dump A; (text, text, Mon Mar 07 12:00:00 CD
如何添加架构中未定义的固定字段(例如日期或月份)?我运行了以下 pig 脚本以将固定日期添加到我的结果表中,并收到以下错误消息:Invalid field projection。方案中不存在投影字段
我是一名优秀的程序员,十分优秀!