codecamp

C++ Deck成员函数

有了Deck对象之后,把所有从属于Deck的函数放入其结构定义中也是情理之中的事了。看一下到目前为止我们定义的函数,很明显12.7节的printDeck函数可以作为候选加进来。下面将printDeck重写为成员函数:

void Deck::print () const {
  for (int i = 0; i < cards.length(); i++) {
    cards[i].print ();
  }
}

通常,引用当前对象不需要使用点记号。

其他几个函数,至于是否应将它们变为Card或Deck的成员函数,还是作为以Card或Deck变量为参数的非成员函数,并非显而易见的。比如上一章以一个Card变量和一个Deck变量为参数的find函数,将它变为Card或Deck类型的成员函数都是合理的。作为练习,请重写find函数,其参数为Card类型,使之成为Deck的成员函数。

将find改写为Card的成员函数需要一些小技巧,这是我写的版本:

int Card::find (const Deck& deck) const {
  for (int i = 0; i < deck.cards.length(); i++) {
    if (equals (deck.cards[i], *this)) return i;
  }
  return -1;
}

一个技巧是,必须使用this关键字来引用调用find函数的对象;再就是在C++中定义相互引用的结构也需要一点技巧,因为编译器正在读取第一个结构定义时还不知道第二个结构的定义。

一种解决方案是,在Card定义之前先声明Deck,以后再给出Deck的定义。

// 声明Deck结构,这里不定义declare that Deck is a structure, without defining it
struct Deck;

// 这样我们就可以在Card的定义中引用Deck
struct Card
{
  int suit, rank;
  Card ();
  Card (int s, int r);
  void print () const;
  bool isGreater (const Card& c2) const;
  int find (const Deck& deck) const;
};

// 后面给出Deck的定义
struct Deck {
  apvector<Card> cards;

  Deck ();
  Deck (int n);
  void print () const;
  int find (const Card& card) const;
}; 
C++ 另一个构造函数
C++ 洗牌
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }