簡體   English   中英

何時刪除復制構造函數

[英]When to delete copy constructor

我正在構建一個簡單的神經網絡,我有兩個主要的類:NeuralNetwork和Level。 我沒有神經元,因為它是一個簡單的前饋,所有單元在一個級別中共享相同的激活功能。

我以這種方式組織了我的關卡:

NeuralNetwork類具有一個級別向量(不是指針,值),可以快速訪問它們,並且Level類的每個對象都有一個指向prec和next級別的指針,一些矩陣和內容。

更為籠統的問題是:對於像Level這樣的雙鏈表組織的類,應該執行哪些復制/移動構造函數/賦值運算符?

  • 在next和back指針之后復制整個結構,並返回剛剛復制的對象的距離。

  • 復制單個級​​別,使指針next \\ prec指向nullptr,返回僅包含矩陣ecc副本的單個級別。

  • 刪除復制構造函數/賦值運算符。

您的課程由您決定。 話雖如此,人們通常希望通用容器(如鏈表)是可復制的。

設計此類時,通常,請問自己以下問題:

  • 復制此類意味着什么?
  • 復制此類是否有意義?
  • 如果復制此類,用戶會感到驚訝嗎?

如果不清楚此類的復制含義,請不要使其可復制。 如果復制該類沒有意義,請不要使其可復制。 如果人們會驚訝地看到該類被復制(請考慮unique_ptr),請不要經過深思熟慮使其成為可復制的。 這些不是硬性規定,它們只是一些思考點,可以幫助您確定合適的方法。

如果您不想復制某些內容,則刪除關聯的運算符確實很有意義(如果沒有其他作用,則用作文檔)。

如果您確實要使您的類可復制,則取決於您如何實現它。 您可以使共享實例在寫入時進行復制,可以進行熱切復制,可以執行任何操作; 這完全取決於您的用戶(包括您)將要發生什么,以及每個用戶的權衡取舍。

“ NeuralNetwork類具有一個級別向量(不是指針,值。),用於快速訪問它們,並且級別Level的每個對象都有一個指向上級和下一級的指針。”

那有點沒有意義。 上一層是*(this-1) ,下一層是*(this+1) 這是因為vector連續存儲其元素。 當然,要知道是否存在上一層或下一層一個很小的挑戰,但是這個問題不會輕易出現。 輸入層是一個特殊層,因為您可以直接設置其值。 所有下一層都可以安全地從上一層提取其輸入,因此不需要任何層將其輸入推送到下一層。

訓練有點困難,因為您需要進行反向傳播,並且需要雙向行走。 但是,在這里,您可以控制輸入和所需的輸出,因此可以顯式地使用layers.front()layers.back() ,而不會越過它們。

現在,當您復制整個矢量時,每一層都是一個副本,並具有新的this ,但是由於新矢量再次是連續的,因此neigbours的*(this-1) / *(this+1)規則仍然成立。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM