【问题标题】:Define methods of anonymous class in another file在另一个文件中定义匿名类的方法
【发布时间】:2019-02-25 00:33:32
【问题描述】:

我有以下基类:

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 文件中定义函数。但是,由于它是匿名的,我不知道如何在另一个文件中定义它的成员函数。

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

【问题讨论】:

  • 不幸的是,C++ 不能以这种方式工作。最接近此类的方法是在单个翻译单元内的匿名命名空间中声明一个类,这意味着所有内容,包括使用匿名类的所有内容,都包含在单个 .cpp 文件中。
  • 我的意思是我可以在头文件中定义函数,然后它就可以工作了。所以 C++ 确实有效。我只是想问是否有另一种方法不会破坏接口/实现障碍。

标签: c++ class oop inheritance anonymous-class


【解决方案1】:

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

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

有点技术迂腐:课程不是匿名的;它是未命名的。

有什么区别?

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

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

在 C++ 中,只有联合可以是匿名的。匿名的非工会班级格式不正确。 C 中允许匿名结构(C11 起);这是语言不兼容的情况。

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

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

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

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

仅在头文件中包含定义的解决方案如何?

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

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

【讨论】:

  • 有什么区别?你还有什么其他建议可以实现我想要的吗?
  • 另外,只在头文件中有定义的解决方案呢?
  • @indjev99 老实说,目前还不清楚问题所在。如果您不想要多个实例,请不要创建多个实例。您是否面临一些问题,即创建的实例比您想要的多,这迫使您通过阻止多个实例而不是删除不需要的实例创建来修复它?请详细说明。
  • @LightnessRacesinOrbit 好吧,我正在编写的代码应该用作一种库(即使它实际上不会被使用),我不希望它能够成为误用。
  • 通常在 C++ 中,我们不会走得太远。只需记录图书馆应该如何使用,如果人们使用错误,那是他们自己的问题!否则,您的设计会变得不必要地复杂且难以维护,而且不会获得太多收益。
猜你喜欢
  • 2015-07-26
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多