c++ - 在另一个文件中定义匿名类的方法

标签 c++ class oop inheritance anonymous-class

我有以下基类:

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

这是神经网络中神经元激活函数的基类。我想要具有不同类型的 sigmoids/relu/...的不同对象

我真的不想拥有任何特定激活函数的多个实例,所以我想做这样的事情:

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

然后在 .cpp 文件中定义函数。但是,由于它是匿名的,我不知道如何在另一个文件中定义它的成员函数。

那么我怎样才能使上述想法可行,或者以任何其他方式只有一个特定激活函数的实例呢?

最佳答案

I don't know how I can define it's member functions in another file.

那是因为你做不到。无法在类定义之外定义未命名的 类的成员函数,因此无法在另一个文件中定义它们。

有点技术学问:类不是匿名的;它是未命名的。

What is the difference?

未命名类只是没有名称的类,就像您的示例类一样。匿名类是另一个类的成员,其中类和成员对象都没有名称。示例:

struct foo {
    union { // no class name
        int i;
        char c;
    };      // no name for the member object
}:

在 C++ 中只有 union 可以是匿名的。匿名非 union 类的格式不正确。 C 中允许使用匿名结构(自 C11 起);这是语言不兼容的情况。

or in any other way have only one instance of the specific activation function?

好吧,只要你只实例化一次,那么就永远只有一个实例。如果只有一个实例对程序的正确性很重要,那么您可以使用单例模式强制执行。

可以通过将所有构造函数设为私有(private)、使类不可复制(且不可移动)并编写返回对本地静态实例的引用的静态成员工厂函数来实现单例:

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

what about the solution of just having the definitions in the header file?

只是使类未命名并不能阻止类的用户复制一个实例,从而创建更多实例,因此从技术上讲,它不会强制您要求只有一个实例。

声明未命名类的复制构造函数是不可能的,因此您不能声明它们已删除或私有(private)。防止复制的一个技巧是添加一个不可复制、不可移动的成员对象。但我会推荐上面描述的单例模式。

关于c++ - 在另一个文件中定义匿名类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858020/

相关文章:

c++ - 优先队列的一种变体

c++ - 返回指向类的指针的函数

java - 初始化类的正确方法和堆栈溢出错误

python - 在python中,如何使正确的操作数在乘以两个不同的类时优先( __rmul__ 方法)?

oop - 新的架构概念

C++合并排序不起作用

c++ - VC 2010 上带 SSL 的 libpq

php - 执行此递归多对多数据库查找的最优雅方法是什么?

php - 如何向 CodeIgniter 添加自动加载功能?

c++ - Linux 中的 Ctrl + C 中断事件处理