удивительные конструкторы для класса! - PullRequest
2 голосов
/ 18 августа 2010

В чем проблема здесь в этом коде?Это дает ошибку сегментации.Я нашел значение размера в векторе (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; 
 } 

С уважением,
Сринивас Наяк

Ответы [ 6 ]

4 голосов
/ 18 августа 2010

Помимо проблемы с выделением в конструкторе vector (int *a), вам также нужен перегруженный оператор присваивания:

    int operator=(int *a) {
            for(int i=0; i<size; i++)
                    v[i] = a[i];
    }

Поскольку следующие два используют его:

v1 = x; 
v2 = y;
2 голосов
/ 18 августа 2010

Это совсем не удивительно.

Ваш первый конструктор выглядит нормально, второй пропускает выделение для v.

Редактировать: v1 = x, а v2 = y - нетимеет смысл без перегрузки оператора =.

1 голос
/ 18 августа 2010

В сущности, причина возникновения ошибки заключается в строке v1 = х;

Поскольку у вас нет оператора присваивания, это становится: v1 = вектор (х) Который назвал ваш int * конструктор. Этот конструктор работает с размером, инициализированным мусором, который вызывает ошибку сегмента по мере того, как цикл переходит к неверной памяти.

Стратегически проблема в том, что вы хотите создать новый объект для типа int *, но вы не знаете, насколько велик массив, на который вы указываете.

Ваш код выглядит так, как будто вы предполагаете, что массив является правильным размером для текущего определенного вектора, и в этом случае оператор, для которого вы хотите определить эту функцию в предпочтении перед конструктором: operator = (int *)

Как правило, вы немного озадачены тем, какой объект, например, сумма + = это -> v [i] * y. v [I]; обычно просто пишется как в этом контексте sum + = v [i] * y. v [I];

0 голосов
/ 18 августа 2010
  vector (int *a) 
  { 
   for(int i=0; i<size; i++) 
    v[i] = a[i]; 
  } 

Этот конструктор не может работать.

  • Элемент v не инициализирован. Вы не выделили хранилище для значений.

  • Элемент size не инициализирован. Цикл будет пытаться прочитать неопределенное количество значений из переданного указателя.

  • невозможно инициализировать size. Если вам дано int*, нет способа определить, насколько велик указанный массив (если указатель вообще указывает на массив в первую очередь). По этой причине число элементов в массиве должно передаваться отдельно (и почему простые массивы являются PITA).

0 голосов
/ 18 августа 2010

В дополнение ко всем правильным ответам, рассмотрите добавление ключевого слова явное перед всеми вашими конструкторами, которые принимают только один аргумент.Таким образом, его никогда не спутают с операциями присваивания. Вот еще один вопрос, который это объясняет.

0 голосов
/ 18 августа 2010

Я надеюсь, что это домашнее задание!
В противном случае вы должны использовать std :: Vector

Пара проблем:

  • Конструктор должен инициализировать все элементы.
    • Ни один конструктор не делает этого.
  • Конструктор копирования (или что-то вроде) не определен неправильно.
  • Поскольку ваш класс управляет RAWуказатель, который вы должны увидеть «Правило трех»
    • т.е. вам не хватает оператора присваивания
  • Предпочитаете использовать списки инициализаторов, когда вы можете
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...