自动和参考

时间:2018-02-04 11:59:22

标签: 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&);
};

所以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

我看到的解决方案:

  1. draw_card返回一个指针 - 丑陋,因为我相信指针 是表示可以返回nullptr - 不是真的
  2. put_card获得一个指针 - 与上面的相同为什么不是
  3. 禁用卡的复制构造函数 - 丑陋,因为它不是卡的问题 - 没有理由限制卡类

2 个答案:

答案 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课程或开始使用智能指针 - 无论哪种方式更适合您的程序。