以下操作是收银机的一部分。
为了生成账单,我应该计算产品:
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));
有什么想法吗?
答案 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)
并且不保持指向创建的对象的指针将导致内存泄漏。它在堆上分配内存,您无法在以后释放此内存(使用删除调用)。