C++ 为什么C++;构造函数是否接受不正确的类型作为参数?
标题几乎说明了一切。我有一个构造函数C++ 为什么C++;构造函数是否接受不正确的类型作为参数?,c++,inheritance,constructor,C++,Inheritance,Constructor,标题几乎说明了一切。我有一个构造函数 Brain::Synapse::Synapse(Neuron *new_neuron); 但是当我传递一个不正确的类型时(来自这样一个向量的成员) std::向量神经元; 突触*新突触=新突触(神经元[神经元指数]); 它工作得很好(这就是问题所在)Motor_Neuron是从Neuron派生出来的一个类,所以我怀疑这就是原因。最终我的问题是,我需要一些突触s连接到神经元s,而另一些连接到运动神经元s。Synapse类有一个成员,该成员是指向“连接的神经
Brain::Synapse::Synapse(Neuron *new_neuron);
但是当我传递一个不正确的类型时(来自这样一个向量的成员)
std::向量神经元;
突触*新突触=新突触(神经元[神经元指数]);
它工作得很好(这就是问题所在)
Motor_Neuron
是从Neuron
派生出来的一个类,所以我怀疑这就是原因。最终我的问题是,我需要一些突触
s连接到神经元
s,而另一些连接到运动神经元
s。Synapse
类有一个成员,该成员是指向“连接的神经元”的指针。我一直在尝试重载构造函数,但我认为这行不通,因为如果其中一个构造函数接受了错误的类型,我看不出如何选择正确的构造函数。如果运动神经元
继承自神经元
,那么它就不是错误的类型。这是继承的全部基础;继承的类是它们的父类,只是有一些额外的部分
听起来更像是需要处理应用程序的类层次结构。坚实的原则是很好的指导方针。与此相关的是Liskov替换原则,该原则规定“程序中的对象应可替换为其子类型的实例,而不改变该程序的正确性。”如果你的运动神经元
不能担任神经元
的角色,则它不应从中继承。如果它需要利用神经元
的某些功能,可以让它有一个神经元
作为成员,并从那里使用它的功能
创建
Motor\u Neuron
构造器并删除它或抛出异常都有解决办法,但我并不真的容忍试图修复这样的症状,而是去寻找根源;你的设计。如果运动神经元
继承自神经元
,那么它不是一个不正确的类型。这是继承的全部基础;继承的类是它们的父类,只是有一些额外的部分
听起来更像是需要处理应用程序的类层次结构。坚实的原则是很好的指导方针。与此相关的是Liskov替换原则,该原则规定“程序中的对象应可替换为其子类型的实例,而不改变该程序的正确性。”如果你的运动神经元
不能担任神经元
的角色,则它不应从中继承。如果它需要利用神经元
的某些功能,可以让它有一个神经元
作为成员,并从那里使用它的功能
创建
Motor\u Neuron
构造器并删除它或抛出异常都有解决办法,但我并不真的容忍试图修复这样的症状,而是去寻找根源;你的设计。你不想这样做,因为运动神经元
是从神经元
衍生出来的,所以这是可以实现的。也就是说,如果您在synapse中编写了delete构造函数,它应该拒绝代码:synapse(Motor_Neuron*)=delete代码>。正确的方法可能是使用另一个子类Neuron
,类似于Regular\u Neuron
?如果构造函数接受Neuron
类型,它应该接受任何Neuron
派生类型,这就是继承的工作方式。我认为您应该分析Motor\u Neuron
类型所需的特定构造函数。@Justin WellNeuron
就是子类是重点<代码>运动神经元
s只是有一些附加功能。然而,他们不允许有突触,到目前为止,为了解决这个问题,我已经确保从来没有添加过突触,但我认为可能需要进行一些重构,因为这有点像圆-椭圆问题@Mr.HelloBye为了验证这一点,你需要改变你的设计。一个好的起点可以像一个抽象类一样设置Neuron
,并创建一个名为Normal\u Neuron
的新派生类。然后,为Synapse
添加两个构造器:Synapse(Motor\u Neuron*)
和Synapse(Normal\u Neuron*)
@MatiasCerrota,这样做的目的是确保选择了正确的构造器,因为这两个选项没有正确的继承关系?感谢您的帮助您不想这样做,因为运动神经元
是从神经元
衍生而来的,所以希望它能正常工作。也就是说,如果您在synapse中编写了delete构造函数,它应该拒绝代码:synapse(Motor_Neuron*)=delete代码>。正确的方法可能是使用另一个子类Neuron
,类似于Regular\u Neuron
?如果构造函数接受Neuron
类型,它应该接受任何Neuron
派生类型,这就是继承的工作方式。我认为您应该分析Motor\u Neuron
类型所需的特定构造函数。@Justin WellNeuron
就是子类是重点<代码>运动神经元
s只是有一些附加功能。然而,他们不允许有突触,到目前为止,为了解决这个问题,我已经确保从来没有添加过突触,但我认为可能需要进行一些重构,因为这有点像圆-椭圆问题@Mr.HelloBye为了验证这一点,你需要改变你的设计。一个好的起点可以像一个抽象类一样设置Neuron
,并创建一个名为Normal\u Neuron
的新派生类。然后,为Synapse
添加两个构造器:Synapse(运动神经元*)
和Synapse(正常神经元*)
@
std::vector<Motor_Neuron*> neurons;
Synapse *new_synapse = new Synapse(neurons[neuron_index]);