c++ - 将变量传递给派生类的构造函数会产生垃圾值,基类和派生类的构造函数都有不同的参数。为什么?
问题描述
派生类和基类的构造函数都有不同的参数。
将变量传递给派生类的构造函数时,在声明基类数组时会给出垃圾值。数组大小不是“n”,而是一些垃圾值。
class LinkedList{
public:
Node* head;
LinkedList()
{
cout << "c";
head=NULL;
}
};
class hashing : public LinkedList{
public:
int n;
hashing(int num)
{
this->n=num;
}
LinkedList* l = new LinkedList[n];
void iterateL()
{
for(int i=0; i<n; i++)
{
l[i].head=NULL;
cout << i << endl;
}
}
};
int main()
{
int n=7;
hashing op(n);
}
散列类中的循环预计会运行 7 次,但在运行 4 次后会出现错误。
解决方案
好的,这里的问题很微妙(到我一开始没有看到问题的地步)。
问题是您this->n
在类成员初始化期间使用 n ( ) 的值进行初始化。
问题是,在 C++ 中,这些初始化程序都在成员初始化期间运行,这是在构造函数主体之前。this->n
由于在构造函数主体之前没有设置值,this->n
因此根本没有初始化
换句话说,你所拥有的和写作一样
hasing(int num): l(new LinkedList[n]) {
this->n = num;
}
这是因为默认情况下,所有成员都按照类中指定的顺序进行初始化,=
并酌情替换默认成员初始化程序(类定义中的表达式)。
有几种解决方案:
使用成员初始化器
hashing(int num): n(num),l(new LinkedList[n])
{
}
使用构造函数体:
hashing(int num)
{
this->n = num;
this->l = new LinkedList[n];
}
在上述两种情况下,我都不会设置默认成员说明符。我只想声明指针。
LinkedList* l; // No default member initializer
最后,我会确保您正确处理破坏和复制/移动分配。
推荐阅读
- sql - SQL中的层次结构 - 显示节点下的所有元素
- modelica - 我可以在 Modelica 脚本中定义新变量吗?
- r - 应该编写什么代码来根据 R 列中包含相同内容的观察结果创建新变量?
- javascript - 使用 JS 删除 onclick 功能
- mysql - 数据类型限制
- c++ - Why does an inline user-provided constructor odr-uses base class constructors?
- php - 为什么我没有在我的数据库中获取数据?
- javascript - 为什么这个正则表达式只适用于字符串结束符号?
- c++ - 计算文件中的矩形数
- reactjs - 在非反应组件中访问上下文