У меня есть такой код:
class Money
{
};
class Dollar : public Money
{
public:
Dollar(int amount);
Dollar times(int value);
bool operator==(const Dollar& dollar);
int amount;
};
Dollar::Dollar(int amount)
: amount(amount)
{
}
Dollar Dollar::times(int value)
{
return Dollar(amount * value);
}
bool Dollar::operator==(const Dollar& dollar)
{
return amount == dollar.amount;
}
Я хочу его протестировать, используя GoogleMock:
#include <gmock\gmock.h>
using ::testing::Eq;
TEST(Money, TestDollarMultiplication)
{
Dollar five(5);
Dollar product = five.times(2);
ASSERT_THAT(product.amount, Eq(10));
product = five.times(3);
ASSERT_THAT(product.amount, Eq(15));
}
Этот тест работает, но я хочу сделать его чистым и написать как-то так:
TEST(Money, TestDollarMultiplication)
{
Dollar five(5);
Dollar product = five.times(2);
ASSERT_THAT(product, Eq(Dollar(10)));
}
или
ASSERT_THAT(five.times(2), Eq(Dollar(10)));
Обратите внимание, что в Eq(Dollar(10))
передается r-value.
Этот код не компилируется:
error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "const Dollar" (или приемлемое преобразование отсутствует)
Мне предлагают посмотреть во внутренности библиотеки:
namespace internal {
struct AnyEq {
template <typename A, typename B>
bool operator()(const A& a, const B& b) const { return a == b; }
};
В чем здесь проблема и как ее исправить?
У вашего оператора сравнения отсутствует const
квалификатор (как и у функции times
).
bool operator==(const Dollar& dollar) const;
bool Dollar::operator==(const Dollar& dollar) const
{
return amount == dollar.amount;
}
И не забывается про const
квалификатор для переменных, при его использовании проблема бы вскрылась раньше:
const Dollar five(5);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нигде не могу найти описание функций begin() и end(), для чего они нужны? Если можно напишите пример пожалуйста :)
У static_cast очень много различных примененийЕго идея состоит в следующем: это ограниченный по мощи C-style cast