2015-12-03 3 views
-1

Следующая операция является частью кассового аппарата.C++ Невозможно преобразовать параметр из '* type' в 'const type &'

Для того, чтобы сгенерировать счет, я должен считать товары:
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: 'CountedProduct :: CountedProduct': не удается преобразовать параметр 1 из 'Product *', чтобы 'const CountedProduct &'

Ошибка повторная к этой строке:
addItsCountedProduct(p->getBarcode(), new CountedProduct(p));

Любые идеи?

+0

Вы не показываете свой конструктор для 'CountedProduct', но' p' является 'продуктом *', и ошибка, кажется, указывает, что у вас есть только 'CountedProduct (const CountedProduct &)'? – crashmstr

+3

C++ не является C# или Java. Не вводите в заблуждение аналогичный синтаксис или знакомые ключевые слова, это совершенно другой язык, культура программирования и набор парадигм. Прежде чем продолжить, вы можете сначала узнать больше о «путях C++»: [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide- и-list) (начните с передовой практики и промежуточных разделов). – Drop

ответ

2

Если функция принимает const CountedProduct&, тогда вы не должны создавать указатель.

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

Вы должны просто создать экземпляр в стек

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

Спасибо, но ошибка относится к первому аргументу. – user3165438

+0

См. Мое редактирование – user3165438

1

Оператор new CountedProduct(p) возвращает указатель, тип: CountedProduct*. Вы хотите получить постоянную ссылку: const CountedProduct &.

Чтобы исправить это заменить строку:

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

с:

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

Как и в сторону вызова new CountedProduct(p) и не сохраняя указатель на объект, созданный вызовет утечку памяти. Он выделяет память в куче, и у вас нет возможности позже освободить эту память (с вызовом на удаление).

+1

Спасибо, но отвечает ли это на мой вопрос? – user3165438

+0

См. Мой отредактированный вопрос – user3165438

Смежные вопросы