此代码中的问题是什么? 它给出了分段错误。我在向量中找到了大小的值(int * a) 不再是3.这是怎么回事?
#include <iostream>
using namespace std;
class vector
{
int *v;
int size;
public:
vector(int m)
{
v = new int[size = m];
for(int i=0; i<size; i++)
v[i] = 0;
}
vector (int *a)
{
for(int i=0; i<size; i++)
v[i] = a[i];
}
int operator*(vector &y)
{
int sum = 0;
for(int i=0; i<size; i++)
sum += this -> v[i] * y . v[i];
return sum;
}
};
int main()
{
int x[3] = {1,2,3};
int y[3] = {4,5,6};
vector v1(3);
vector v2(3);
v1 = x;
v2 = y;
int R = v1 * v2;
cout << "R = " << R;
return 0;
}
此致
Srinivas Nayak
答案 0 :(得分:4)
除了构造函数vector (int *a)
中的分配问题外,还需要一个重载的赋值运算符:
int operator=(int *a) {
for(int i=0; i<size; i++)
v[i] = a[i];
}
由于以下两个使用它:
v1 = x;
v2 = y;
答案 1 :(得分:2)
这一点都不奇怪。
你的第一个构造函数似乎没问题,第二个构建函数确实错过了v。
的分配编辑:v1 = x和v2 = y没有重载operator =。
没有意义答案 2 :(得分:1)
从本质上讲,它产生故障的原因就在于此 V1 = X;
由于您没有赋值运算符,这实际上变为: V1 =向量(x) 这叫做你的int *构造函数。这个构造函数运行时的大小初始化为垃圾,当循环进入无效内存时会导致seg错误。
战略上问题是你想为int *创建一个新对象,但是你不知道你指向的数组有多大。
您的代码看起来像是要假设数组是当前定义的向量的正确大小,在这种情况下,您希望定义此函数的运算符优先于构造函数:operator =(int *)
例如,您通常对哪个对象感到困惑 sum + = this - &gt; v [i] * y。 v [I]; 在这种情况下,通常会写出来 sum + = v [i] * y。 v [I];
答案 3 :(得分:0)
我希望这是作业!
否则你应该使用std :: Vector
一些问题:
答案 4 :(得分:0)
除了此处的所有正确答案之外,请考虑在只接受一个参数的所有构造函数之前添加关键字 explicit 。这样,它永远不会与赋值操作混淆。 Here's另一个解释它的问题。
答案 5 :(得分:0)
vector (int *a)
{
for(int i=0; i<size; i++)
v[i] = a[i];
}
这个构造函数不可能正常工作。
v
成员未初始化。您尚未为值分配存储空间。
size
成员未初始化。循环将尝试从传递的指针读取未确定数量的值。
无法初始化 size
。如果给你一个int*
,则无法确定指向数组的大小(如果指针偶数指向一个数组)。这就是为什么必须单独传递数组中元素的数量(以及为什么普通数组是PITA)的原因。