gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:23:56 28 4
gpt4 key购买 nike

我有以下基类:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com