Как go о сокрытии "вспомогательных функций" от интерфейса заголовочного файла - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь реализовать класс 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 отсюда?

Дайте мне знать, если есть что-то, над чем мне стоит остановиться, спасибо!

1 Ответ

2 голосов
/ 02 марта 2020

Вы можете определить функцию, локальную для исходного файла, поместив ее в анонимное пространство имен:

// in your cpp file:
namespace {
  long to_cents(long d, int c) {
    // ...
  }
}

Вы также можете сделать то же самое, сделав ее static функцией:

// in your cpp file
static long to_cents(long d, int c) {
  // ...
}
...