C++ C++;引用和指针

C++ C++;引用和指针,c++,pointers,reference,C++,Pointers,Reference,我的21点游戏程序中有以下代码: Player *p; Deck *d = new Deck(); Hand *playerHand = new Hand(), *dealerHand = new Hand(); p = get_Simple(); //This returns a pointer to an instance of a Simple Player for my game Card dealerCard = d->deal(); p->draw(dealerCard

我的21点游戏程序中有以下代码:

Player *p;
Deck *d = new Deck();
Hand *playerHand = new Hand(), *dealerHand = new Hand();
p = get_Simple();  //This returns a pointer to an instance of a Simple Player for my game
Card dealerCard = d->deal();
p->draw(dealerCard, playerHand);
draw定义为

virtual bool draw(Card dealer, const Hand &player);
当我尝试运行此代码时,出现以下错误:

error: no matching function for call to 'Player::draw(Card&, Hand*&);
note: candidates are: virtual bool Player::draw(Card, const Hand&);

快速修复方法是将呼叫与签名匹配:

p->draw(dealerCard, *playerHand);

正确的方法是继续编写代码,去掉动态分配和原始指针,用智能指针代替它们

快速修复方法是将呼叫与签名匹配:

p->draw(dealerCard, *playerHand);

正确的方法是继续编写代码,去掉动态分配和原始指针,用智能指针代替它们

错误信息非常清楚(在多次看到它之后):

错误:调用“Player::draw(Card&,Hand*&)”时没有匹配函数; 注:候选对象为:虚拟布尔玩家::抽牌(牌、常手&)

在代码中,您试图将
手*
传递给函数,但编译器没有找到接受这些卡的重载。它得到的最接近的函数是一个使用
常量&
的函数

您需要取消对指针的引用以访问对象:

p->draw(dealerCard, *playerHand);

可选地考虑是否需要用指针保存所有对象。如果避免使用指针,代码会简单得多。

错误信息非常清楚(在多次看到它之后):

错误:调用“Player::draw(Card&,Hand*&)”时没有匹配函数; 注:候选对象为:虚拟布尔玩家::抽牌(牌、常手&)

在代码中,您试图将
手*
传递给函数,但编译器没有找到接受这些卡的重载。它得到的最接近的函数是一个使用
常量&
的函数

您需要取消对指针的引用以访问对象:

p->draw(dealerCard, *playerHand);

可选地考虑是否需要用指针保存所有对象。如果避免使用指针,代码会简单得多。

谢谢,这似乎很有效!我不熟悉智能指针,因为这是针对性能并不重要的类的,所以这个解决方案工作得很好。但一旦我对C++有了一些经验,我可能会回来尝试重写这个代码,以提高效率。谢谢你的提示@CAMDIDE不是关于效率,而是在C++编译器中编写良好的C++代码而不是C代码。我能用一些资源来查看一些常见的C++标准吗?我对java比对C++更熟悉,所以我真的不知道指针有什么好的做法。@ CAMDROID,非常感谢-我会试着看看列表中的一些书。谢谢,这似乎有用!我不熟悉智能指针,因为这是针对性能并不重要的类的,所以这个解决方案工作得很好。但一旦我对C++有了一些经验,我可能会回来尝试重写这个代码,以提高效率。谢谢你的提示@CAMDIDE不是关于效率,而是在C++编译器中编写良好的C++代码而不是C代码。我能用一些资源来查看一些常见的C++标准吗?我对java比对C++更熟悉,所以我不太清楚指针的好习惯。@ CAMDROID,非常感谢——我会尝试去查一下列表中的一些书。< C++ > *x=新的T-()。为什么不干脆
Hand playerHand
new T()
只为每个对象设置一些默认值,如果我只调用
Hand playerHand
,就不会这样做。我想我可以手动设置它们,但仅仅使用指针似乎更容易。从这里的答案来看,我可能错了,哈哈
手动*playerHand=新playerHand()生成不同的对象,然后您可以通过初始化POD子对象在构造函数中修复它。否则,您可以执行
Hand player和=Hand() <代码> t*x=新的Th()/<代码>在C++中是一个好主意。为什么不干脆
Hand playerHand
new T()
只为每个对象设置一些默认值,如果我只调用
Hand playerHand
,就不会这样做。我想我可以手动设置它们,但仅仅使用指针似乎更容易。从这里的答案来看,我可能错了,哈哈
手动*playerHand=新playerHand()生成不同的对象,然后您可以通过初始化POD子对象在构造函数中修复它。否则,您可以执行
Hand player和=Hand()