2017-07-04 106 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

相关问题