Я не знаю, как определить функции-члены в другом файле.
Это потому, что вы не можете.Невозможно определить функции-члены безымянного класса † вне определения класса, поэтому невозможно определить их в другом файле.
† Aнемного технической педантичности: класс не анонимный;это безымянно.
В чем разница?
Неназванные классы - это просто классы без имени, как ваш пример класса.Анонимный класс является членом другого класса, где ни у класса, ни у объекта-члена нет имени.Пример:
struct foo {
union { // no class name
int i;
char c;
}; // no name for the member object
}:
Только союзы могут быть анонимными в C ++.Анонимные не состоящие в профсоюзе классы плохо сформированы. Разрешены анонимные структуры в C (начиная с C11);это тот случай, когда языки несовместимы.
или каким-либо другим образом есть только один экземпляр определенной функции активации?
Ну, покапоскольку вы создаете экземпляр только один раз, тогда будет только один экземпляр.Если для правильности программы важно иметь только один экземпляр, вы можете применить это с помощью шаблона синглтона.
Синглтон можно реализовать, сделав все конструкторы частными, сделав класс не подлежащим копированию (и не-movable) и написание статической функции фабрики-члена, которая возвращает ссылку на локальный статический экземпляр:
class LogisticActivationFunction : public Network::ActivationFunction
{
public:
static LogisticActivationFunction& get()
{
static LogisticActivationFunction obj;
return obj;
}
double evaluate(double x);
double evaluate_derivative(double x);
// prevent copying / moving
LogisticActivationFunction(LogisticActivationFunction const&) = delete;
private:
// allow only member functins to construct
LogisticActivationFunction() = default;
};
как насчет решения, состоящего только из определения в заголовочном файле?
Простое присвоение класса неназванным не мешает пользователю класса делать копии одного экземпляра, создавая тем самым больше, поэтому технически не требует вашего требования иметь только один экземпляр.
Объявление конструктора копирования безымянного класса невозможно, поэтому вы не можете объявить их удаленными или закрытыми.Хитрость для предотвращения копирования может заключаться в добавлении не копируемого, неподвижного объекта-члена.Но я бы рекомендовал описанный выше шаблон синглтона.