我正在尝试使用随机代码来接受使用动态大小的值。令人惊讶的是,Accept函数中的for循环不会执行。相反,控件直接离开函数。请解释一下这里的错误是什么?
size
答案 0 :(得分:3)
这里有一些问题。
size
设置为构造函数内的任何内容。对于第一,我建议将类成员size
重命名为size_
或类似的东西,因为这会创建一个分离并使变量更容易相互区分。至于第二个问题,我会将你的构造函数改为:
consequtive::consequtive(int size) : size_(size) // Assuming the member is called `size_`
{
ptr = new int[size];
}
代码应该现在可以使用,并使用名为member initializer lists的概念。未设置变量size
会导致undefined behavior。
答案 1 :(得分:1)
您忘记初始化size
成员变量。
你可以这样做:
consequtive::consequtive(int size)
: size(size),
ptr(new int[size])
{
}
您还应该在类中添加析构函数,以避免内存泄漏:
consequtive::~consequtive()
{
delete[] ptr;
}
答案 2 :(得分:0)
类定义中的size
public : int *ptr;
int size;
构造函数实现中的size
consequtive::consequtive(int size)
以及size
函数
main
int size = 0;
都是不同的变量。后两者由于它们的使用方式都具有相同的值,但是一个size
可以更改为不同的值,而另一个不知道。提问者代码中的错误是因为第一个size
从未给出值并且未初始化使用。
解决方案:
consequtive::consequtive(int size): ptr(new int [size]), size(size)
{
}
我们在这里使用Member Initializer List。在这种情况下,我们不会从它的使用中获得太多收益,但它是一个非常有用的工具。更多相关内容:Why should I prefer to use member initialization list?
使用与成员同名的参数或局部变量时要小心。最内部的标识符总是赢得内部
consequtive::consequtive(int size): ptr(new int [size]), size(size)
{
// in here
}
size
变量是参数而不是成员。您可以this->size
明确声明您想要该成员,但最好不要重复使用该标识符。您可能忘记添加this->
,编译器不太可能警告您错误。