我有以下课程:
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&);
};
所以Deck管理卡片。它会将参考返回到卡片。然后可以将卡放在板上 - 使用 const引用表示它不能是nullptr
也不能更改。正如您所看到的,Board存储指向卡片的指针(因为多态性)。
有问题的代码:
auto card = deck.draw_card(); // a copy of a card is created
card.rotate();
board.put_card(card); // board will get a pointer to a temporary variable
我看到的解决方案:
draw_card
返回一个指针 - 丑陋,因为我相信指针
是表示可以返回nullptr
- 不是真的put_card
获得一个指针 - 与上面的相同为什么不是答案 0 :(得分:2)
你可以告诉auto
变量是引用,只需写
auto& card = deck.draw_card();
const
参考
const auto& card = deck.draw_card();
答案 1 :(得分:2)
使用auto&
:
auto& card = deck.draw_card();
因此在类型扣除期间不会丢弃引用。
另外,请注意,使用std::vector
原始指针:
std::vector<Card const*> cards;
不是最好的主意。当您的卡片来到Board
外,Board
本身并不能控制它所引用卡片的使用寿命。在这种情况下,很容易获得悬空指针并移动到UB区域。
您应该考虑将卡片复制到Board
课程或开始使用智能指针 - 无论哪种方式更适合您的程序。