2017-07-04 145 views
0

標題幾乎說明了一切。我有一個構造函數爲什麼C++構造函數接受不正確的類型作爲參數?

Brain::Synapse::Synapse(Neuron *new_neuron); 

但是,當我將它傳遞了不正確的類型(成員從載體這樣)

std::vector<Motor_Neuron*> neurons; 
Synapse *new_synapse = new Synapse(neurons[neuron_index]); 

它工作得很好(這是個問題)。 Motor_Neuron是從Neuron派生的類,所以我懷疑這是原因。我的問題最終是我需要一些​​s連接到Neuron s和其他到Motor_Neuron s。​​類有一個成員,它是指向「連接的神經元」的指針。我一直在試圖重載構造函數,但我不認爲這會起作用,因爲如果其中一個構造函數接受了錯誤的類型,我就不會看到如何選擇正確的構造函數。

+1

你不想這樣做,因爲'Motor_Neuron'是從'Neuron'派生出來的,所以它可以工作。也就是說,如果你寫了在突觸中刪除了構造函數,它應該拒絕代碼:'Synapse(Motor_Neuron *)= delete;'。正確的做法可能有另一個'Neuron'的子類,像'Regular_Neuron'? – Justin

+1

如果構造函數接受'Neuron'類型,它應該接受任何'Neuron'派生類型,它的繼承方式。我想你應該分析'Motor_Neuron'類型的特定構造函數的需要。 –

+0

@Justin Well'Neuron'就是那個子類。 'Motor_Neuron's只是有一些額外的功能。然而,他們不允許有突觸,並且迄今爲止解決了我確定突觸永遠不會被添加,但我認爲一些重構可能是有序的,因爲這有點像圓橢圓問題https:///en.wikipedia.org/wiki/Circle-ellipse_problem –

回答

2

如果Motor_Neuron繼承自Neuron,則它不是錯誤的類型。這是繼承的全部基礎;繼承類他們的父類,只是一些額外的零碎。

聽起來更像是需要處理應用程序的類層次結構。 SOLID原則是很好的指導方針。相關的是Liskov替代原則,其中指出「程序中的對象應該可以用其子類型的實例替換而不改變該程序的正確性」。如果您的Motor_Neuron不能填充Neuron的角色,則它不應該從它繼承。如果它需要利用Neuron的某些功能,也許它有一個Neuron作爲成員,並使用它的功能。

有創建一個Motor_Neuron構造函數並刪除它或拋出一個異常,但我並不真正寬恕嘗試修復這樣的症狀,而是得到源代碼;你的設計。

+0

我已閱讀關於SOLID的內容,並一直在嘗試應用它,但我並不完全理解它,而且我仍然很綠。非常感謝你的回答,它完美地解釋了(我認爲)我需要做什麼以及我需要知道如何去做。 –

+0

我從SOLID獲得的主要內容是你如何解決設計問題,解決圓橢圓問題只涉及獨立定義它們,因爲在編程環境中,即使它們在幾何中相關,它們也是非常不相關的。 (這個評論是爲了後代) –

+0

請注意,當你需要除了「派生類是一個基類」合約之外的所有繼承,你可以使用私有繼承。 – Quentin

相關問題