C++ 自动和参考
我有以下课程:C++ 自动和参考,c++,pointers,reference,C++,Pointers,Reference,我有以下课程: class Card { void rotate(); }; class Type1Card : public Card {}; class Type2Card : public Card {}; class Deck { Card& draw_card(); }; class Board { std::vector<Card const*> cards; void put_card(Card const&); };
class Card {
void rotate();
};
class Type1Card : public Card {};
class Type2Card : public Card {};
class Deck {
Card& draw_card();
};
class Board {
std::vector<Card const*> cards;
void put_card(Card const&);
};
我看到的解决方案是:
draw_卡返回一个指针-丑陋,因为我相信那个指针
表示可以返回nullptr-不是真的
put_卡获得一个指针-与上面相同为什么不
禁用卡的复制构造函数-丑陋,因为这不是卡的问题-没有理由限制卡类
您可以告诉自动变量是引用,只需编写
auto& card = deck.draw_card();
常量参考相同
const auto& card = deck.draw_card();
您可以告诉自动变量是引用,只需编写
auto& card = deck.draw_card();
常量参考相同
const auto& card = deck.draw_card();
使用自动&:
因此,在类型推断过程中不会丢弃引用
另外,请注意,使用原始指针的std::vector:
std::vector<Card const*> cards;
这不是最好的主意。当你的牌来到板外时,板本身并不控制它所指的牌的寿命。在这种情况下,非常容易获得悬空指针并移动到UB区域
<>你也许应该考虑只抄卡到黑板类,或者开始使用智能指针——任何适合你的程序。 使用自动&:
因此,在类型推断过程中不会丢弃引用
另外,请注意,使用原始指针的std::vector:
std::vector<Card const*> cards;
这不是最好的主意。当你的牌来到板外时,板本身并不控制它所指的牌的寿命。在这种情况下,非常容易获得悬空指针并移动到UB区域
<>你也许应该考虑只抄卡到黑板类,或者开始使用智能指针——任何适合你的程序。 你是在要求自动的吗?首先你真的需要有多态卡吗?这似乎是一个奇怪的设计…我想我需要。我想尽可能少地输入代码。但在牌组中,我有更多类型的牌,一些动作牌,不能放在板上。我认为只有一种类型的卡会使它有很多未使用的字段,并且过于复杂。我认为这不是一个好的设计。我不知道你的游戏规则,但通常情况下,一个操作应该做什么并不取决于一张牌,而是取决于多张牌的组合。你目前的设计不可避免地会让你陷入一个巨大的动态施法和类型识别混乱,你有两张或更多的卡,需要决定对它们应用什么游戏规则。你是在要求自动吗?你真的需要首先拥有多态卡吗?这似乎是一个奇怪的设计…我想我需要。我想尽可能少地输入代码。但在牌组中,我有更多类型的牌,一些动作牌,不能放在板上。我认为只有一种类型的卡会使它有很多未使用的字段,并且过于复杂。我认为这不是一个好的设计。我不知道你的游戏规则,但通常情况下,一个操作应该做什么并不取决于一张牌,而是取决于多张牌的组合。你当前的设计将不可避免地让你陷入一个巨大的动态施法和类型识别混乱,无论你有两张或更多的卡,你都需要决定对它们应用什么游戏规则。我认为你关于存储指针的评论是必要的。不控制卡寿命的情况是故意的。我想用这副牌来控制牌的寿命。我故意传递了一个引用原始指针作为不拥有指针的指示符。所以复制一张卡片可能是一个更好的选择…我认为你关于存储指针的评论是必要的。不控制卡寿命的情况是故意的。我想用这副牌来控制牌的寿命。我故意传递了一个引用原始指针作为不拥有指针的指示符。所以复制一张卡片可能是一个更好的选择…好的。这会有帮助的。我只关心一个问题,我的意思是我的解决方案:界面的用户需要知道draw_卡返回一个引用,而put_卡需要一个有效的地址。你认为这是一个好的设计吗?@user2146414-用户不需要知道。他们的编译器会告诉他们是否正确设计了类。@StoryTeller,但在我的示例中,他使用auto card=。。。编译器没有告诉他出了什么问题。使用自动卡=。。。是正确的,但需要注意“抽卡”和“放卡”。@user2146414-因为没有任何错误。您没有禁止复制,因此不会阻止用户复制。就像我说的,如果你正确设计你的类。@StoryTeller你认为删除卡片的复制构造函数会是一个正确设计的类吗?正如你在我文章的第三点中看到的,我有一些疑问。但是我很好奇你的意见。这会有帮助的。我只关心一个问题,我的意思是我的解决方案:界面的用户需要知道draw_卡返回一个引用,而put_卡需要一个有效的地址。你认为这是一个好的设计吗?@user2146414-用户不需要知道。他们的编译器会告诉你的
如果你正确地设计你的类,它们就会消失。@StoryTeller,但在我的例子中,他使用自动卡=。。。编译器没有告诉他出了什么问题。使用自动卡=。。。是正确的,但需要注意“抽卡”和“放卡”。@user2146414-因为没有任何错误。您没有禁止复制,因此不会阻止用户复制。就像我说的,如果你正确设计你的类。@StoryTeller你认为删除卡片的复制构造函数会是一个正确设计的类吗?正如你在我文章的第三点中看到的,我有一些疑问。但我很好奇你的意见。