Определить методы анонимного класса в другом файле - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий базовый класс:

class Network::ActivationFunction
{
public:
    virtual double evaluate(double x) =0
    virtual double evaluate_derivative(double x) =0
};

Это базовый класс для функций активации нейронов в нейронной сети.Я хочу иметь разные объекты с разными типами сигмоидов / relu /...

Я действительно не хочу иметь несколько экземпляров какой-либо конкретной функции активации, поэтому я хотел бы сделать что-то вроде этого:

class : public Network::ActivationFunction
{
public:
    double evaluate(double x);
    double evaluate_derivative(double x);
} logisticActivationFunction;

И затем функции, определенные в файле .cpp.Однако, поскольку он анонимный, я не знаю, как я могу определить его функции-члены в другом файле.

Итак, как я могу заставить эту идею работать или каким-либо другим способом иметь только один экземплярконкретная функция активации?

1 Ответ

0 голосов
/ 25 февраля 2019

Я не знаю, как определить функции-члены в другом файле.

Это потому, что вы не можете.Невозможно определить функции-члены безымянного класса вне определения класса, поэтому невозможно определить их в другом файле.

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;
};

как насчет решения, состоящего только из определения в заголовочном файле?

Простое присвоение класса неназванным не мешает пользователю класса делать копии одного экземпляра, создавая тем самым больше, поэтому технически не требует вашего требования иметь только один экземпляр.

Объявление конструктора копирования безымянного класса невозможно, поэтому вы не можете объявить их удаленными или закрытыми.Хитрость для предотвращения копирования может заключаться в добавлении не копируемого, неподвижного объекта-члена.Но я бы рекомендовал описанный выше шаблон синглтона.

...