C ++无法转换' * type'到#const&type;'

时间:2015-12-03 12:50:51

标签: c++ pointers const

以下操作是收银机的一部分。

为了生成账单,我应该计算产品:
1.每个产品都添加一次到账单上 2.如果该产品已存在于该帐单中,则其数量会增加。

void CashRegister::countProducts()
{
OMIterator<Product*> iter(itsProduct);
CountedProduct* cp;
Product* p;

// Iterate through all products counting them
while (*iter) {
  // get the next product
  p = *iter;

  // has this already been added?
  cp = getItsCountedProduct(p->getBarcode());

  // If it does not exist then add it else increment it
  if (NULL==cp) {
    addItsCountedProduct(p->getBarcode(), new CountedProduct(p));
  } else {                                                       
    cp->increment();
  }                 
  // point to next
  ++iter;
}    

和:

void CashRegister::addItsCountedProduct(int key, CountedProduct* p_CountedProduct) 
{
if(p_CountedProduct != NULL)
    {
        NOTIFY_RELATION_ITEM_ADDED("itsCountedProduct", p_CountedProduct, false, false);
    }
else
    {
        NOTIFY_RELATION_CLEARED("itsCountedProduct");
    }
itsCountedProduct.add(key,p_CountedProduct);

}

我收到以下错误:
错误C2664:&#39; CountedProduct :: CountedProduct&#39; :无法转换&#39;产品*&#39;中的参数1到&#39; const CountedProduct&amp;&#39;

错误是对此行的引用:
addItsCountedProduct(p->getBarcode(), new CountedProduct(p));

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果函数采用const CountedProduct&,则不应创建指针。

addItsCountedProduct(p->getBarcode(), new CountedProduct(p))  // wrong

您应该只在堆栈上创建一个实例

addItsCountedProduct(p->getBarcode(), CountedProduct(p))

答案 1 :(得分:1)

语句new CountedProduct(p)返回一个指针,类型为:CountedProduct*。您想要一个恒定的引用:const CountedProduct &

要解决此问题,请更换以下行:

addItsCountedProduct(p->getBarcode(), new CountedProduct(p));

with:

addItsCountedProduct(p->getBarcode(), CountedProduct(p));

作为旁边调用new CountedProduct(p)并且不保持指向创建的对象的指针将导致内存泄漏。它在堆上分配内存,您无法在以后释放此内存(使用删除调用)。