何时删除复制构造函数

时间:2017-04-12 10:49:14

标签: c++ linked-list

我正在构建一个简单的神经网络,我有两个主要的分类:NeuralNetwork和Level。我没有神经元,因为它是一个简单的前馈,一个级别中的所有单元共享相同的激活功能。

我以这种方式组织了我的关卡:

类NeuralNetwork有一个级别向量(不是指针,值。),用于快速访问它们,类Level的每个对象都有一个指向前一级和下一级的指针,一些矩阵和东西。

更一般的问题是: 组织为像Level这样的双链表的类的复制/移动构造函数/赋值运算符应该做什么?

  • 按照下一个和后一个指针复制整个结构,并返回刚刚复制的对象的istance。

  • 复制单个级​​别,将指针下一个\ prec复制到nullptr,返回单个级别,仅包含矩阵的副本ecc ..

  • 删除复制构造函数/赋值运算符。

2 个答案:

答案 0 :(得分:1)

你的课程取决于你。话虽如此,人们通常会希望链接列表等通用容器可以复制。

在设计此类课程时,更常见的是,请问自己以下内容:

  • 复制此课程意味着什么?
  • 复制这门课有意义吗?
  • 如果复制此类,用户会感到惊讶吗?

如果不清楚复制此课程的含义,请不要将其复制。如果复制此课程并不具有意义,请不要将其复制。如果人们会惊讶地看到课程被复制(想想unique_ptr),不要在没有认真思考的情况下使其复制。这些并不是一个很难的规则,这些只是一些思路,可以帮助你找出合适的东西。

如果你不打算制作一些可复制的东西,删除相关的操作符确实有意义(如果没有别的话,这就作为文档)。

如果你确实让你的课堂可以复制,那么你可以根据自己的实施方式来决定。您可以创建在写入时复制的共享实例,您可以急切地复制,您可以随心所欲地执行任何操作;这一切都取决于你的用户(包括你)将会发生什么,以及每个用户的权衡取舍。

答案 1 :(得分:0)

“类NeuralNetwork有一个级别向量(不是指针,值。),用于快速访问它们,类Level的每个对象都有一个指向prec和下一级的指针”

这有点无意义。上一层为*(this-1),下一层为*(this+1)。那是因为vector连续存储其元素。当然,知道上一层还是下一层是一个小小的挑战,但这个问题不会出现。由于您直接设置了值,因此输入图层是一个特殊图层。所有下一层都可以安全地从前一层拉出输入,因此没有层需要将其输入推送到下一层。

训练有点困难,因为你有一个反向传播阶段,需要双向行走。但是,在这里您可以控制输入和所需的输出,因此您明确使用layers.front()layers.back(),绝不会超越它们。

现在,当您复制整个矢量时,每个图层都是一个副本,并且有一个新的this,但由于新矢量再次连续,因此邻居的*(this-1) / *(this+1)规则仍然坚持。