[英]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.