C++ 独特的ptr与共享的ptr-设计

C++ 独特的ptr与共享的ptr-设计,c++,c++11,design-patterns,c++14,c++17,C++,C++11,Design Patterns,C++14,C++17,我在写纸牌游戏。我有以下类别:卡牌、牌组、玩家、棋盘、游戏逻辑 牌组包含一组唯一的_ptr牌。然后从牌组中抽出一张牌并传递给玩家。然后,玩家选择一张牌并放入。。。这里我有一个设计问题。因为到目前为止,拥有一个独特的ptr是完全可以的。但是我想把一张牌传给Board和GameLogic 目前,我已将唯一的\u ptr转换为共享的\u ptr。但我觉得它要么丑陋,要么不合逻辑 我相信正确使用指针是非常重要的,应该告诉您变量的生存期。我做错了什么,但不知道 您对如何解决这个问题有什么建议吗?如果您对共

我在写纸牌游戏。我有以下类别:卡牌、牌组、玩家、棋盘、游戏逻辑

牌组包含一组唯一的_ptr牌。然后从牌组中抽出一张牌并传递给玩家。然后,玩家选择一张牌并放入。。。这里我有一个设计问题。因为到目前为止,拥有一个独特的ptr是完全可以的。但是我想把一张牌传给Board和GameLogic

目前,我已将唯一的\u ptr转换为共享的\u ptr。但我觉得它要么丑陋,要么不合逻辑

我相信正确使用指针是非常重要的,应该告诉您变量的生存期。我做错了什么,但不知道


您对如何解决这个问题有什么建议吗?

如果您对共享指针和唯一指针都不满意,那么没有比普通指针更好的选项了。使用观察者模式,这在对象之间的一对多依赖关系时非常有用,以便当一个对象更改状态时,其所有依赖项都会得到通知并自动更新。

以下是您自己的话:

甲板上有一个唯一的向量。然后,一张卡片从卡片中抽出 一副牌,传给一名球员。然后,玩家选择一张牌并放入。。。在这里 我有一个设计问题。因为到目前为止,拥有一个 独特的ptr。但是我想把一张卡片传给董事会和董事会 游戏逻辑

可能您在构造函数中创建了每张卡。虽然这是完全可行的,但我看不出有什么意义。前提是始终有相同数量的固定卡。我的意思是,你不会创建每种类型的新卡或任何东西

我只是将一副牌创建为一个简单的数组,并将平均指针传递给玩家等等。当牌组被销毁时,牌将被销毁

class Deck {
public:
    const static int NumCards = ...;
...
private:
    Card cards[NumCards];
};

class Player {
public:
    void dealt(Card*[] cards);
};
< C++的优点之一是,允许在堆或堆栈中存储对象之间进行选择。前者更灵活(例如,当可用卡的数量随时间变化时),后者更高效,前提是您事先知道项目的数量,就像在本例中所做的那样


希望这有帮助。

要使用具有特定寿命的对象:

  • 更喜欢值而不是指针。根据需要复制值或传递引用,但不要存储引用,因为引用的值可能会被删除
  • 当需要指针时,如果您可以识别一个所有者,请首选
    唯一的\u指针。根据需要传递引用,但不要存储它们
  • 当有多个所有者或需要存储“引用”时,使用
    共享\u指针。传递弱指针
    ,可根据需要存储和锁定

请注意,您还可以提供一些id作为参考,以便以后可以访问可能已删除的对象。如果你的
只不过是一个id(红桃皇后),只要递一份就行了。

虽然我同意其他答案中的观点,这里不一定需要指针,但如果你确实使用指针,最简单的方法是使用参考:

class Deck
{
private:
    std::vector<unique_ptr<Card>> cards;
public:
    const Card& get_card(unsigned index); // returns cards[index]
}
类甲板
{
私人:
向量卡;
公众:
const Card&get_Card(未签名索引);//返回卡片[index]
}

const
引用允许您引用它,而无需将其转换为
shared\u ptr
(并且不存在代码其他部分修改它的风险)。

我通常的建议不是将智能指针视为简单的自删除指针,而是从所有权的角度来看。“资源”是有多个所有者(
std::shared_ptr
)还是只有一个所有者(
std::unique_ptr
)?也许智能指针在这里不正确,但您应该使用普通的非拥有指针?或者想出一个不需要指针的设计?为什么使用指针而不仅仅是卡片值?为什么有
unique\ptr
s?卡片是多态的(为什么)?你可以只使用一个
向量
并按值复制它们。@Someprogrammerdude一个所有者拥有一个共享指针,然后非所有者获得指向它的弱指针,这没什么错。当然,您可以用Java编写最终使用的语法,但它会非常好地工作。@UKMonkey您必须有特定的理由需要弱指针,因为它们很慢。但是当需要的时候,它们是伟大的!好啊我有你的解决办法。我只是觉得从牌堆里拿张牌是个好主意。就像模拟现实世界,如果你抽一张牌,它就不再在牌堆里了。我希望它能帮助我避免犯错误。当你复制一个值时,你必须记住从所有地方删除它。啊,如果这是你想要的,你可以这样做
std::将
唯一的\u ptr
牌组
移动到
玩家
,那么它显然属于玩家,不再在牌组中。之后,您可以通过参考
板将其传递到
(使用上述解决方案)!好啊但是玩家可以放一张牌(他不再持牌)。因此,也许我应该
std::将它移动到某个管理对象,并将原始指针传递给
逻辑
。你怎么看?听起来好像任何一张牌都是
牌组
播放器
、或
棋盘
的一部分。因此,在其中一个类中保留一个
唯一的\u ptr
,并传递对
逻辑的引用(或者让
逻辑读取其他类,这取决于实现)。除此之外,您也可以使用原始指针而不是引用–这里的主要区别是引用不能是
null
,这听起来像是您在这里想要的。正如您可以看到我的其他注释一样,我需要polimorphizm。但除此之外,我不喜欢这样的解决方案是,我需要一些其他变量来管理卡片组中的抽卡。当我有指针时,我可以从一副牌中得到一张牌。我想你需要多态性,因为