gpt4 book ai didi

c++ - 相互引用的常量对象

转载 作者:行者123 更新时间:2023-11-28 05:08:53 25 4
gpt4 key购买 nike

作为帮助形象化问题的动机(否则直接跳到下面的代码),假设我正在编写一个纸牌游戏,让某些纸牌“在场”允许您“购买”手中的其他纸牌。因此,举例来说,假设您有一手四张牌,其中包含一张 A,您决定打出它。然后你又拿到了四张牌,现在你可以免费玩一张王牌。等等。

现在,我想编写这个游戏。我创建了一个 Card 结构:

struct Card {
std::string name_;

Card(const std::string name) : name_{name} {}

std::string name() const { return name; }
};

const Card ace("ace");
const Card one("one");
// etc.

但后来我决定我不仅要记录卡的名称,还要记录它免费提供的卡,还有免费提供这张卡的卡。像这样说:

struct Card {
std::string name_;
const Card* parent_; // card that gave this card for free
const Card* child_; // card that this card gives for free

Card(const std::string name) : name_{name} {}

std::string name() const { return name; }
std::string parent() const { return parent_->name(); }
std::string child() const { return child_->name(); }
};

(这段代码显然是零碎的,不是很健壮,但我只是想把原理讲清楚。)为了添加 parent / child ,我还创建了以下方法:

struct Card {
// ...

private:
void set_parent(const Card* c) {
parent_ = c;
}
public:
void add_child(Card& c) {
child_ = &c;
c.set_parent(this);
}

// ...
};

现在,我可以像这样创建 Card 对象:

Card ace("ace");
Card queen("queen");
// etc.

ace.add_child(queen);
// etc.

但是,我不得不牺牲 Card 对象的常量性。让我澄清一下,这只是一个基本示例。我打算编写的代码在其 Card 类中有许多数据成员。因此,我想在不明确复制数据的情况下指向父/子卡。我也有很多“卡片”,所以我希望尽可能不复制数据。

我的问题是:有什么方法可以让 Card 对象保持为常量(因为它们从不 包含可变数据)?还是我想错了?

可能与这个问题相关的是隐含的问题:这甚至重要吗?我是否有充分的实际理由希望这个功能常量对象在代码中作为常量?即使没有,但即便如此,是否有办法使这些对象 const 只是出于兴趣。

最佳答案

正如您所指出的,一张卡片的数据(它的身份加上一些关于它的规则)是不变的。此外,它们在编译时是已知的。所以:

#include <array>

enum class Rank {
None, Ace, Two, Three, Four // ...
};

struct Card
{
Rank rank = Rank::None;
std::array<Rank, 2> from = {};
std::array<Rank, 2> to = {};
};

constexpr Card cards[] = {
{},
{Rank::Ace, {Rank::Two, Rank::Three}, {}},
{Rank::Two, {}, {Rank::Ace}},
{Rank::Three, {Rank::Four}, {Rank::Ace, Rank::Four}},
{Rank::Four, {Rank::Three}},
};

您可以根据需要使数组变大。现在你有一套完整的数据,这些数据在编译时都是已知的,并且在存储中是紧凑的。

关于c++ - 相互引用的常量对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43959859/

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