一个令人惊讶的班级建设者!

时间:2010-08-18 11:53:49

标签: c++ constructor

此代码中的问题是什么? 它给出了分段错误。我在向量中找到了大小的值(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

6 个答案:

答案 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

一些问题:

  • 构造函数应初始化所有成员。
    • 两个构造函数都没有这样做。
  • 未正确定义复制构造函数(或似乎是什么)。
  • 因为你的班级管理一个RAW指针,你需要看到“三个规则”
    • 即您缺少作业运算符
  • 当您可以
  • 时,更喜欢使用初始化程序列表

答案 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)的原因。