我有以下基类:
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文件中定义函数。但是,由于它是匿名的,所以我不知道如何在另一个文件中定义它的成员函数。
那么我如何使上述想法起作用,或者以其他任何方式仅具有特定激活功能的一个实例?
答案 0 :(得分: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;
};
仅在头文件中包含定义的解决方案是什么?
仅使类不命名不会阻止类的用户复制一个实例,从而创建了更多实例,因此从技术上讲,它并不要求您仅拥有一个实例。
无法声明未命名类的副本构造函数,因此您不能声明它们为已删除或私有。防止复制的技巧可能是添加不可复制的,不可移动的成员对象。但我建议改用上述单例模式。