首页 > 解决方案 > 将变量传递给派生类的构造函数会产生垃圾值,基类和派生类的构造函数都有不同的参数。为什么?

问题描述

派生类和基类的构造函数都有不同的参数。

将变量传递给派生类的构造函数时,在声明基类数组时会给出垃圾值。数组大小不是“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 次后会出现错误。

标签: c++oopconstructorgarbage

解决方案


好的,这里的问题很微妙(到我一开始没有看到问题的地步)。

问题是您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

最后,我会确保您正确处理破坏和复制/移动分配。


推荐阅读