Форум программистов, компьютерный форум CyberForum.ru

Найти ошибку в перегрузке копиконструктора и операторов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ чтение матрицы из файла http://www.cyberforum.ru/cpp-beginners/thread879782.html
Здравствуйте. Помогите, пожалуйста сделать запрос в самом начале программы(считать из файла или ввести вручную) и организовать само считывание вот текст программы #include <iostream> #include <iomanip> #include <ctime> #include <cmath> #include <iomanip> #include <fstream> #include <conio.h>
C++ Класс "Точка". Функция - определение в каком координатном угле находится точка 1. Определить в глобальной области видимости функцию в соответствии с вариантом. Доступ к полям класса осуществить с помощью соответствующих методов класса; 2. Определить дружественную функцию с аналогичной функциональностью; 3. В функции main вывести на экран результаты работы обеих функций для заданного объекта (номер объекта в массиве вводится с клавиатуры). Результаты работы функций должны... http://www.cyberforum.ru/cpp-beginners/thread879762.html
Из нерассортированного списка целых чисел удалить все наибольшие элементы, оставив первый из них C++
Доброго времени суток. Никак не могу сделать эти задания(( Буду премного благодарен тому, кто поможет мне хоть с одной из них! Из нерассортированного списка целых чисел удалить все наибольшие элементы, оставив первый из них. Выручите плиз! Очень нужны эти задачи!
Перевести целое отрицательное четырёхбайтное число из десятичной в двоичную систему счисления C++
Доброго времени суток. Никак не могу сделать эти задания(( Буду премного благодарен тому, кто поможет мне хоть с одной из них! Перевести целое отрицательное четырёхбайтное число из десятичной в двоичную систему счисления: (повторение) используя алгоритм деления на 2 (см. первый семестр); (повторение) используя битовые операции (см. первый семестр); используя объединение и поля битов.
C++ Шаблонный класс (конструктор по умолчанию, основной конструктор и конструктор копирования; перегрузить операторные функции) http://www.cyberforum.ru/cpp-beginners/thread879747.html
5.1. Разработать шаблонный класс Set. Класс должен содержать конструктор по умолчанию, основной конструктор и конструктор копирования. Перегрузить в этом классе операторные функции, которые обеспечивают ввод/вывод элементов класса, а также операторную функцию присваивания. Кроме этого перегрузить операторные функции * и *=, которые вычисляют пересечение двух множеств. Создать с помощью этого...
C++ В одномерных массиве вычислить произведение элементов в значении которое не менее числа 1 В одномерных массиве вычислить произведение элементов в значении которое не менее числа 1. Заменить этим произведением первый и последний элемент массива. Оформить в виде, функций . Спасибо заранее) подробнее

Показать сообщение отдельно
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
26.05.2013, 21:18     Найти ошибку в перегрузке копиконструктора и операторов
Вот код. в QT отлично работает. а в Visual Studio выдает ошибку на строке
C++
1
(a+b).show();
помогите понять в чем проблема.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
using namespace std;
 
struct vec {double x,y,z;};
class arr_vec {
private:
    double *x;
    double *y; //указатели на координаты
    double *z;
    int n;//количество элементов массива
public:
    arr_vec(int);//конструктор принимает количество элементов массива
    ~arr_vec();//деструктор
    void set(int,vec); //устанавливает новый вектор vec на позицию int
    vec operator[](int) const;//оператор возвращает вектор с позиции int
    friend arr_vec operator+(const arr_vec&,const arr_vec&);
    friend arr_vec operator*(const arr_vec&,double);
    friend arr_vec operator*(double,const arr_vec&);
    void show();
};
vec operator+(vec a, vec b); //оператор складывания массивов векторов
vec operator*(vec a, double b);//оператор умножения вектора на число
 
vec toVec(double x,double y, double z) {
    vec tmp;
    tmp.x=x;                       //функция создания вектора из 3-х чисел
    tmp.y=y;
    tmp.z=z;
    return tmp;
}
 
arr_vec::arr_vec(int N) { //описание конструктора
    n=N;
    x=new double[n]; //созаём массив из n элементов иксовых координат
    y=new double[n];
    z=new double[n];
    for(int i=0;i<n;i++) {x[i]=i; y[i]=i+1; z[i]=i+2;} //по умолчанию запполнение всего массива дефолтными значениями
}
 
arr_vec::~arr_vec() { //описание деструктора
    delete[]x;
    delete[]y;
    delete[]z;
}
 
void arr_vec::set(int N, vec tmp) { //функция вместо N-ого ветора вставляет этот вектор
    if(n<N) return;
    x[N]=tmp.x;
    y[N]=tmp.y;
    z[N]=tmp.z;
}
 
vec arr_vec::operator [](int N) const { //возвращает вектор с номера N
    return toVec(x[N],y[N],z[N]);
}
 
arr_vec operator+(const arr_vec& a,const arr_vec& b) { //оператор складывания массивов векторов
    arr_vec c(a.n);
    for(int i=0; i<c.n; i++)
        c.set(i,a[i]+b[i]);
    return c;
}
 
vec operator+(vec a, vec b) { //оператор складывания векторов
    return toVec(a.x+b.x,a.y+b.y,a.z+b.z);
}
 
vec operator*(vec a, double b) {//оператор умножения векторов
    return toVec(a.x*b,a.y*b,a.z*b);
}
 
arr_vec operator*(const arr_vec& a,double k) {//оператор умножения матрицы векторов на число
    arr_vec c(a.n);
    for(int i=0; i<c.n; i++) {
        c.set(i,a[i]*k);
    }
    return c;
}
 
arr_vec operator*(double k, const arr_vec& a) {//умножения числа на вектор; //константные ссылки
    return a*k;
}
 
void arr_vec::show() {
    cout<<endl<< "X: "; for(int i=0;i<n;i++) cout<<x[i]<<"  ";
    cout<<endl<< "Y: "; for(int i=0;i<n;i++) cout<<y[i]<<"  ";
    cout<<endl<< "Z: "; for(int i=0;i<n;i++) cout<<z[i]<<"  ";
    cout<<endl;
}
 
int main() {
    arr_vec a(5),b(5);
    vec a1,a2,a3,a4;
    a1=toVec(1,1,1);
    a2=toVec(2,1,0);
    a3=toVec(4,3,5);
    a4=toVec(1,-1,9);
    a.set(0,a1);
    a.set(1,a2);
    b.set(0,a3);
    b.set(1,a4);
    a.show();
    b.show();
    (a+b).show();
    a.show();
    (a*5).show();
    (5*a).show();
}
В Visual Studio работает если поменять код операторов + и * на такой:
C++
1
2
3
4
5
6
7
arr_vec operator+(const arr_vec& a,const arr_vec& b) { //оператор складывания массивов векторов
    arr_vec *c;
    c=new arr_vec(a.n);
    for(int i=0; i<c->n; i++)
        c->set(i,a[i]+b[i]);
    return *c;
}
но перестает работать если добавить копиконструктор сделанный так:
C++
1
2
3
4
5
6
7
8
arr_vec::arr_vec(const arr_vec& A) {
    n=A.n;
    for(int i=0; i<n; i++) {
        x[i]=A.x[i];
        y[i]=A.y[i];
        z[i]=A.z[i];
    }
}
Что я не так делаю?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru