Я пытаюсь реализовать класс Money, который имеет представление для денег (например, 13,00 долл. США, 18,92 долл. США и т. Д. c.) И набор операций. Вот файл заголовка на данный момент:
#include <iostream>
namespace Currency {
class Money {
private:
long int total_cents = 0;
public:
Money();
Money(long int c);
Money(long int d, int c);
long int get_cents() const {return total_cents;}
//Money(float dollars); // TODO
};
std::ostream& operator<<(std::ostream& os, const Money& m);
std::istream& operator>>(std::istream& is, const Money& m);
// Returns the total number of cents in $d.c
long int to_cents(long int d, int c);
}
Моя проблема в том, что я не намерен, чтобы последняя вспомогательная функция была отделена от интерфейса, поэтому я хочу определить ее только в файле cpp как функция реализации. Я только хочу, чтобы конструктор Money (long int, int) вызывал его, а пользователь будет когда-либо иметь дело только с классом Money (я добавлю еще несколько полезных операций позже), поэтому у него не будет никаких причин для вызова to_cents.
Меня беспокоит то, что если я объявлю это в файле cpp и пользователь создаст другую функцию с тем же именем в отдельном файле, возникнет конфликт имен, что приведет к ошибке компоновщика. Но я не могу придумать какой-либо другой способ скрыть to_cents от интерфейса, кроме размещения его в качестве частного члена Money. Не было бы особого смысла делать его закрытым членом Money, поскольку он не читает и не пишет ни одному из своих членов данных. Другая альтернатива - выписать функцию в конструкторе, но я думаю, что она служит логически отдельным вычислением, поэтому она должна быть своей собственной функцией. Какой самый лучший способ добраться до go отсюда?
Дайте мне знать, если есть что-то, над чем мне стоит остановиться, спасибо!