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

C++ 在另一个文件中定义匿名类的方法,c++,class,oop,inheritance,anonymous-class,C++,Class,Oop,Inheritance,Anonymous Class,我有以下基类: class Network::ActivationFunction { public: virtual double evaluate(double x) =0 virtual double evaluate_derivative(double x) =0 }; 这是神经网络中神经元激活函数的基类。我想用不同类型的sigmoid/relu/创建不同的对象 我真的不想有任何特定激活函数的多个实例,因此我想做如下操作: class : public Network:

我有以下基类:

class Network::ActivationFunction
{
public:
    virtual double evaluate(double x) =0
    virtual double evaluate_derivative(double x) =0
};
这是神经网络中神经元激活函数的基类。我想用不同类型的sigmoid/relu/创建不同的对象

我真的不想有任何特定激活函数的多个实例,因此我想做如下操作:

class : public Network::ActivationFunction
{
public:
    double evaluate(double x);
    double evaluate_derivative(double x);
} logisticActivationFunction;
然后在.cpp文件中定义函数。但是,由于它是匿名的,我不知道如何在另一个文件中定义它的成员函数

那么,我如何才能使上述想法发挥作用,或者以任何其他方式只有一个特定激活函数的实例

我不知道如何在另一个文件中定义它的成员函数

那是因为你不能。无法在类定义之外定义未命名†类的成员函数,因此无法在其他文件中定义它们

†有点技术迂腐:课程不是匿名的;它没有名字

有什么区别

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

struct foo {
    union { // no class name
        int i;
        char c;
    };      // no name for the member object
}:
<>只有C++中的工会可以匿名。匿名非联合类的格式不正确。C中允许匿名结构(从C11开始);这是一种语言不兼容的情况

或者以任何其他方式只有一个特定激活功能的实例

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

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

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;
};
那么在头文件中只包含定义的解决方案呢

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


无法声明未命名类的复制构造函数,因此不能将其声明为已删除或私有。防止复制的一个技巧是添加一个不可复制、不可移动的成员对象。但是我会建议用上面描述的单模式来代替。

不幸的是C++根本不起作用。最接近这种情况的是在单个转换单元内的匿名命名空间中声明一个类,这意味着所有内容,包括使用匿名类的所有内容,都包含在单个.cpp文件中。我的意思是,我可以在头文件中定义函数,然后它就可以工作了。所以C++工作。我只是想问,是否有其他方法可以避免接口/实现障碍。区别是什么?你还有什么其他建议吗?我怎样才能实现我想要的?还有,把定义放在头文件中的解决方案呢?@indjev99老实说,问题出在哪里还不清楚。如果您不需要多个实例,请不要创建多个实例。您是否面临创建的实例比您希望的多的问题,这迫使您通过阻止多个实例而不是通过删除不需要的实例创建来解决问题?请详细解释。@ LexNeasraceSimulnOracle,我编写的代码应该被用作一种库(即使它实际上也不会被使用),我也不希望它被滥用。通常在C++中,我们不会走太远的路径。只要记录下图书馆应该如何使用,如果人们用错了,那就是他们自己的问题!否则,您会使您的设计变得不必要的复杂和难以维护,并且不会获得太多收益。