Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C++;构造函数是否接受不正确的类型作为参数?_C++_Inheritance_Constructor - Fatal编程技术网

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 Well
Neuron
就是子类是重点<代码>运动神经元
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 Well
Neuron
就是子类是重点<代码>运动神经元
s只是有一些附加功能。然而,他们不允许有突触,到目前为止,为了解决这个问题,我已经确保从来没有添加过突触,但我认为可能需要进行一些重构,因为这有点像圆-椭圆问题@Mr.HelloBye为了验证这一点,你需要改变你的设计。一个好的起点可以像一个抽象类一样设置
Neuron
,并创建一个名为
Normal\u Neuron
的新派生类。然后,为
Synapse
添加两个构造器:
Synapse(运动神经元*)
Synapse(正常神经元*)
@
std::vector<Motor_Neuron*> neurons;
Synapse *new_synapse = new Synapse(neurons[neuron_index]);